From dda182c22c58e94a76526c1d02987a38e646c557 Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Mon, 7 Mar 2022 12:04:27 +0800 Subject: [PATCH] Add keygen & change database --- android/app/build.gradle | 26 ++++++--- android/app/src/main/AndroidManifest.xml | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 2329 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 2106 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 2560 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 3868 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 4497 bytes lib/display_pannel.dart | 5 +- lib/event_bus.dart | 4 +- lib/generator.dart | 18 ++++-- lib/offline.dart | 6 +- lib/show_dialogs.dart | 54 ++++++++++++++++++ lib/validation_provider.dart | 22 +++++-- pubspec.lock | 44 +++++++------- pubspec.yaml | 2 +- 15 files changed, 135 insertions(+), 48 deletions(-) mode change 100644 => 100755 android/app/src/main/res/mipmap-hdpi/ic_launcher.png mode change 100644 => 100755 android/app/src/main/res/mipmap-mdpi/ic_launcher.png mode change 100644 => 100755 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png mode change 100644 => 100755 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 lib/show_dialogs.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 97d9332..a4908e7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -25,6 +25,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +def keystoreProperties = new Properties() + def keystorePropertiesFile = rootProject.file('key.properties') + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + } + android { compileSdkVersion flutter.compileSdkVersion @@ -50,13 +56,19 @@ android { versionName flutterVersionName } - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } } flutter { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 08ad43b..dde8a7b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ #J_qfj5MR1tK$GR4CsOLR+)!-XyCe8?y@pTD9T> zv8Yo=Es8U0t5%R&ADvniwYH-&b!c?}wN_dm<0zvJwZ+HK*7j})L0h%{X=XNi@7;6H zckcPV{gU!&sjo-$i|VIPC?YJ$=5%yVmajfx===Q2*a7I)*PA>;R48Iw<*UcE*lYI{ ziszGfTeg&KO`%!AtzyLurOAaTN>J}(iA7tn7n12v z6bgJSoLmS!(#Wo0UY8&VqDy#!w$S586mo1Rptr!6AFzjGNth4ah+9NhRY0GYPV_-W z5_~p6$nQ$jw62I4MJWL`DvS4ULXkLHRutR-&5Q(1ILaDD05t*hHkFE2>u6vc3k);> zolq;P1CEiHX9Eiy?sWoa%Ko{C?7T5yW33-2K*>VDlI6`jHETyG@!QddEK??}29|g+nH2J$`RdNM4f>@NrWpFf;Q1#p&Tc2VaRE#! z<3@Fn^>Doe)@2fTJruT+gzVn_NSJ`KhniuRSkz(VVW_pEN$AG`deFgqsP)Ic)zhU= zgcV!N2{zYHx7M9pUaAUT)S5Sb^9##1J(sho=a@}lQJWO~E~fU_uz&B`dHmv~BVPK^ zm9^vcz@@9cA3Alzu963h*#j%=y+#f>+9wH=hK9Q$cm4k7gRRG|`VwCAPZ+*`!Jw)J z$A+RqZ|}Qx&a-b=+_|=U_1Q=3BkEc_vnH)P!45muD!t)M1;-ccS-#(LJ7Q+$s<@41 z^ve|&E+4NLw;&dNJ)!B2CEZ!jr{?sxeMVjB3)1cy8VV0KKvPQHnh(I5M*EqR?>cI0 z$vN>GoxhEGHL@jKcc3tvn64aG_PyKM zuAj>K7`C6iac87GV_Vw|G@E6-xO?5r!E+k>7hK=I+tof4G}msqJBa?gX;jISFI|Jf zHFM2nXX3My`s<=C;8c5NOwK#^zqowhbX*%-(|Tm+?&c9o8WycF)Lp7yxOm%Vk>wX^ zYg_z8+UPBB?rTv*u0Na;dva|~@1~VexfSt$X)abB?zmMNGsYS-zS+C_t0vQoKN?PN z&iLs4D1x{+wQnXk(H;}iacfmY#Nv)Qfyt7?pX8j(|0Zqjyo|wHcizk_Tamb(6_aL$ z?d2A(K76(HSQYGFnR&f_AXmM6>m`@JZ_@b-X=RsklUuIuuutE&tTxWUF@9ExKH6+Y?V|GZcxrP5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png old mode 100644 new mode 100755 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0fc220caabfd5771eb995baa8c356a72bc2e7dc0 GIT binary patch literal 2106 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 literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png old mode 100644 new mode 100755 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..8acf0b093e017b73b8577d39e8262c0075e49299 GIT binary patch literal 3868 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 Hw8Q@f!<|q` literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..9a911133a58b18ec8104f78e69315f48b7649214 100644 GIT binary patch literal 4497 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 PY2xJIW`D^xVAuZu40TDq literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/lib/display_pannel.dart b/lib/display_pannel.dart index 647d1dd..1ace43e 100644 --- a/lib/display_pannel.dart +++ b/lib/display_pannel.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-03-05 20:56:05 - * @LastEditTime : 2022-03-07 09:35:24 + * @LastEditTime : 2022-03-07 12:03:43 * @Description : The display widget of the wordle game */ @@ -212,6 +212,9 @@ class _WordleDisplayWidgetState extends State with TickerPr c++; }); } + else { + return true; + } } else if(noti.type == InputType.backSpace) { if(c > 0 && !onAnimation) { diff --git a/lib/event_bus.dart b/lib/event_bus.dart index d9d8db6..c774a64 100644 --- a/lib/event_bus.dart +++ b/lib/event_bus.dart @@ -1,12 +1,10 @@ /* * @Author : Linloir * @Date : 2022-03-05 21:50:33 - * @LastEditTime : 2022-03-05 23:15:18 + * @LastEditTime : 2022-03-07 10:26:04 * @Description : Event bus class */ -import 'package:flutter/material.dart'; - typedef EventCallBack = void Function(dynamic args); final EventBus mainBus = EventBus(); diff --git a/lib/generator.dart b/lib/generator.dart index 6c98883..f9f1f84 100644 --- a/lib/generator.dart +++ b/lib/generator.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-03-06 15:03:57 - * @LastEditTime : 2022-03-07 08:34:56 + * @LastEditTime : 2022-03-07 11:16:16 * @Description : Word generator */ @@ -15,13 +15,13 @@ abstract class Words { static String _cache = ""; //static Map explainations = {}; - static Future importWordsDatabase({int length = 5}) async { + static Future importWordsDatabase({int length = 5}) async { //explainations.clear(); if(length != _length || dataBase.isEmpty){ _length = length; dataBase.clear(); _cache = ""; - var data = await rootBundle.loadString('popular.txt'); + var data = await rootBundle.loadString('assets/popular.txt'); // LineSplitter.split(data).forEach((line) { // int seperatePos = line.indexOf(','); // if(seperatePos != length + 2) { @@ -38,14 +38,20 @@ abstract class Words { } _cache = line + "s"; }); - print('Imported ${dataBase.length}'); } + if(dataBase.isEmpty) { + return false; + } + return true; } - static Future generateWord() async{ + static Future generateWord() async{ int bound = dataBase.length; if(bound == 0) { - await Words.importWordsDatabase(); + var import = await Words.importWordsDatabase(); + if(!import) { + return null; + } bound = dataBase.length; } var rng = Random(); diff --git a/lib/offline.dart b/lib/offline.dart index f614b1b..ecc0d15 100644 --- a/lib/offline.dart +++ b/lib/offline.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-03-05 20:41:41 - * @LastEditTime : 2022-03-07 09:30:56 + * @LastEditTime : 2022-03-07 11:05:14 * @Description : Offline page */ @@ -40,8 +40,8 @@ class _OfflinePageState extends State with TickerProviderStateMixin actions: [AnimatedSwitcher( duration: const Duration(milliseconds: 750), reverseDuration: const Duration(milliseconds: 750), - switchInCurve: Curves.bounceInOut, - switchOutCurve: Curves.bounceInOut, + switchInCurve: Curves.bounceOut, + switchOutCurve: Curves.bounceIn, transitionBuilder: (child, animation) { var rotateAnimation = Tween(begin: 0, end: 2 * pi).animate(animation); var opacAnimation = Tween(begin: 0, end: 1).animate(animation); diff --git a/lib/show_dialogs.dart b/lib/show_dialogs.dart new file mode 100644 index 0000000..e027280 --- /dev/null +++ b/lib/show_dialogs.dart @@ -0,0 +1,54 @@ +/* + * @Author : Linloir + * @Date : 2022-03-07 10:28:38 + * @LastEditTime : 2022-03-07 10:59:46 + * @Description : Show import failed dialog + */ + +import 'package:flutter/material.dart'; + +Future showFailedDialog({required context}) { + return showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('Error Occurred'), + content: const Text('Something went wrong when importing dictionary, nothing is imported.'), + actions: [ + TextButton( + child: const Text('Retry'), + onPressed: () => Navigator.of(context).pop(true), + ), + TextButton( + child: const Text('Ignore'), + onPressed: () => Navigator.of(context).pop(), + ) + ], + ); + } + ); +} + +Future showLoadingDialog({required context}) { + return showDialog( + context: context, + builder: (context) { + return UnconstrainedBox( + child: SizedBox( + width: 280, + child: AlertDialog( + contentPadding: const EdgeInsets.all(50.0), + content: Align( + alignment: Alignment.center, + child: CircularProgressIndicator( + color: Theme.of(context).brightness == Brightness.dark ? Colors.white : Colors.grey[850], + strokeWidth: 6.0, + ), + ), + ), + ), + ); + }, + barrierDismissible: false, + ); +} \ No newline at end of file diff --git a/lib/validation_provider.dart b/lib/validation_provider.dart index ef48cd1..4d6dd81 100644 --- a/lib/validation_provider.dart +++ b/lib/validation_provider.dart @@ -1,11 +1,12 @@ /* * @Author : Linloir * @Date : 2022-03-05 21:40:51 - * @LastEditTime : 2022-03-07 08:10:08 + * @LastEditTime : 2022-03-07 11:15:55 * @Description : Validation Provider class */ import 'package:flutter/material.dart'; +import 'show_dialogs.dart'; import './event_bus.dart'; import './generator.dart'; @@ -39,8 +40,22 @@ class _ValidationProviderState extends State { } void _newGame() async{ - answer = await Words.generateWord(); - print('Generated answer $answer'); + showLoadingDialog(context: context); + var generated = await Words.generateWord(); + Navigator.of(context).pop(); + while(generated == null) { + var retry = await showFailedDialog(context: context); + if(retry == null) { + Navigator.of(context).popUntil(ModalRoute.withName('/')); + break; + } + else { + showLoadingDialog(context: context); + generated = await Words.generateWord(); + Navigator.of(context).pop(); + } + } + answer = generated ?? ""; answer = answer.toUpperCase(); letterMap = {}; answer.split('').forEach((c) { @@ -95,7 +110,6 @@ class _ValidationProviderState extends State { @override void initState(){ super.initState(); - _newGame(); mainBus.onBus(event: "NewGame", onEvent: _onNewGame); mainBus.onBus(event: "Result", onEvent: _onGameEnd); } diff --git a/pubspec.lock b/pubspec.lock index 9b41ab4..7e78bae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,56 +5,56 @@ packages: dependency: transitive description: name: async - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.8.2" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" characters: dependency: transitive description: name: characters - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0" charcode: dependency: transitive description: name: charcode - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" clock: dependency: transitive description: name: clock - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" collection: dependency: transitive description: name: collection - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.15.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0" flutter: @@ -66,7 +66,7 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" flutter_test: @@ -78,35 +78,35 @@ packages: dependency: transitive description: name: lints - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.12.11" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.1.3" meta: dependency: transitive description: name: meta - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.7.0" path: dependency: transitive description: name: path - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.8.0" sky_engine: @@ -118,56 +118,56 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.8.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0" test_api: dependency: transitive description: name: test_api - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.4.8" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.3.0" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index b1f4f61..681548a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,7 +64,7 @@ flutter: assets: - assets/unixWords.txt - assets/ospd.txt - - popular.txt + - assets/popular.txt # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.