index.dart 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. export 'i18n.dart';
  2. export 'cache.dart';
  3. export 'logger.dart';
  4. export 'request.dart';
  5. export 'user_ext.dart';
  6. export 'size_fit.dart';
  7. export 'net_error.dart';
  8. export 'image_utils.dart';
  9. export 'notification.dart';
  10. import 'package:flutter/material.dart';
  11. import 'package:bot_toast/bot_toast.dart';
  12. import 'package:flutter/services.dart';
  13. import 'package:flutter_app_upgrade/flutter_app_upgrade.dart';
  14. import 'package:twong/models/index.dart';
  15. import 'package:twong/utils/request.dart';
  16. import 'package:twong/widgets/floading.dart';
  17. import 'package:twong/widgets/loading.dart';
  18. import 'package:twong/widgets/photo_view.dart';
  19. import 'cache.dart';
  20. import 'package:twong/utils/i18n.dart';
  21. import 'package:twong/router/base.dart';
  22. import 'package:twong/widgets/dialog.dart';
  23. import 'logger.dart';
  24. class Utils {
  25. static String _channel = "android/back/desktop";
  26. static void showAlert(BuildContext context, {String title, Function ok, String okText, String noText}) {
  27. showDialog(
  28. context: context,
  29. builder: (context) {
  30. return CustomDialog(
  31. content: title,
  32. callback: (res) {
  33. ok?.call();
  34. }
  35. );
  36. }
  37. );
  38. }
  39. static void notOpen () {
  40. BotToast.showText(text: '功能暂未开放!');
  41. }
  42. static String formatRMB(dynamic number, { bool show = false,
  43. bool sign = false, bool cn = false })
  44. {
  45. if(number == null) number = 0;
  46. num price = 0;
  47. if(number is num) {
  48. price = number;
  49. } else {
  50. price = double.parse(number.toString());
  51. }
  52. var s = "";
  53. if(sign) {
  54. s = price > 0 ? "+" : "-";
  55. }
  56. if(cn) {
  57. return "${price.toStringAsFixed(2)}${I18n.cn}";
  58. }
  59. return "$s${show ? I18n.$ : ""}${price.toStringAsFixed(2)}";
  60. }
  61. static String formatData(num data) {
  62. return DateTime.fromMillisecondsSinceEpoch(data * 1000).toString();
  63. }
  64. static void toLogin() {
  65. if (Cache.context == null) return;
  66. Navigator.pushNamed(Cache.context, RouteNames.login);
  67. }
  68. static void showPhoto({String image, List<String> images, int index = 0}) {
  69. if (Cache.context == null) return;
  70. PhotoListData data;
  71. if (images != null) {
  72. data = PhotoListData(index, images);
  73. } else {
  74. data = PhotoListData(index, [image]);
  75. }
  76. Navigator.pushNamed(Cache.context, RouteNames.picture, arguments: data);
  77. }
  78. static Future backDeskTop() async {
  79. var platform = MethodChannel(_channel);
  80. try {
  81. await platform.invokeMethod("back_to_desktop");
  82. } on PlatformException catch (e) {
  83. debugPrint(e.toString());
  84. }
  85. return Future.value(false);
  86. }
  87. static void loading() {
  88. BotToast.showLoading();
  89. }
  90. static void closeLoading() {
  91. BotToast.closeAllLoading();
  92. }
  93. static void showLoading({dynamic data}) {
  94. var context = Cache.context;
  95. showGeneralDialog(context: context, pageBuilder: (BuildContext buildContext, Animation<double> animation,
  96. Animation<double> secondaryAnimation) {
  97. final Widget pageChild = Builder(builder: (context) {
  98. return WillPopScope(
  99. onWillPop: () async {
  100. return Future.value(false);
  101. },
  102. child: Loading(data: data),
  103. );
  104. });
  105. return pageChild;
  106. });
  107. }
  108. static void copyText(dynamic text) {
  109. Clipboard.setData(ClipboardData(text: text))
  110. .then((value) {
  111. BotToast.showText(text: "复制成功");
  112. }).catchError((err) {
  113. BotToast.showText(text: "复制失败");
  114. });
  115. }
  116. static Widget get loadingWidget {
  117. return CircularProgressIndicator();
  118. }
  119. static void checkUpdate({Function ok, Function cancel}) {
  120. AppUpgrade.appUpgrade(
  121. Cache.context,
  122. _checkAppInfo(),
  123. onOk: ok,
  124. onCancel: cancel,
  125. iosAppId: '1537411658',
  126. );
  127. }
  128. static Future<AppUpgradeInfo> _checkAppInfo() async {
  129. return Request.getVersion().then((remote) async {
  130. var version = await FlutterUpgrade.appInfo;
  131. Cache.checked = true;
  132. var local = Version();
  133. local.version = version.versionName;
  134. var need = remote > local;
  135. Log.i("remote:\t${remote.version}\nlocal:\t${local.version}\n"
  136. "${need ? "need update !" :"already is the latest."}");
  137. closeLoading();
  138. if (need) {
  139. return AppUpgradeInfo(
  140. title: '新版本${remote.version}',
  141. contents: ['检测到有新版本更新,是否立即下载?'],
  142. force: false,
  143. );
  144. } else {
  145. return null;
  146. }
  147. });
  148. }
  149. static String encodeString(String str, {int start = 3, int end = 4,
  150. String char = "*"}) {
  151. var code = "";
  152. int length = str.length - end - start;
  153. for(var i = 0; i < length; i ++) {
  154. code += char;
  155. }
  156. return str.replaceRange(start, str.length - end, code);
  157. }
  158. static String formatName(String name) {
  159. if(name.length > 2) {
  160. return name.substring(0, 1);
  161. }
  162. return name;
  163. }
  164. }