import 'dart:ui'; import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; int getRandomWithNum(int min, int max) { final random = Random(); return random.nextInt(max) + min; // 生成随机数 } double screenWidth(BuildContext context) { double screenWidth = MediaQuery.of(context).size.width; return screenWidth; } void pushPage(Widget page, BuildContext context) { Navigator.push(context, MaterialPageRoute(builder: (context) => page)); } void present(Widget page, BuildContext context) { Navigator.push( context, MaterialPageRoute(fullscreenDialog: true, builder: (context) => page), ); } /// 文本样式工具类 /// 文本样式工具类 /// 文本样式工具类,返回 Text Widget class HhTextStyleUtils { /// 主要标题,返回 Text /// [text]: 文本内容 /// [color]: 文本颜色,默认黑色 /// [fontSize]: 字体大小,默认16.0 /// [bold]: 是否加粗,默认true static Text mainTitle( String text, { Color color = Colors.black, double fontSize = 16.0, bool bold = true, }) { return Text( text, style: TextStyle( color: color, fontSize: fontSize, fontWeight: bold ? FontWeight.bold : FontWeight.normal, ), ); } static TextStyle secondaryTitleStyle = TextStyle( color: Colors.black54, fontSize: 15.0, ); /// 次要标题,返回 Text /// [text]: 文本内容 /// [color]: 文本颜色,默认深灰 /// [fontSize]: 字体大小,默认14.0 /// [bold]: 是否加粗,默认false static Text secondaryTitle( String text, { Color color = Colors.black54, double fontSize = 14.0, bool bold = false, }) { return Text( text, style: TextStyle( color: color, fontSize: fontSize, fontWeight: bold ? FontWeight.bold : FontWeight.normal, ), ); } /// 小文字,返回 Text /// [text]: 文本内容 /// [color]: 文本颜色,默认灰色 /// [fontSize]: 字体大小,默认12.0 /// [bold]: 是否加粗,默认false static Text smallText( String text, { Color color = Colors.black54, double fontSize = 12.0, bool bold = false, }) { return Text( text, style: TextStyle( color: color, fontSize: fontSize, fontWeight: bold ? FontWeight.bold : FontWeight.normal, ), ); } } /// 版本信息模型类 class AppVersionInfo { final String versionName; // 版本名称(如 1.0.0) final String buildNumber; // 构建号(如 1) final String fullVersion; // 完整版本(如 1.0.0+1) AppVersionInfo({ required this.versionName, required this.buildNumber, required this.fullVersion, }); @override String toString() { return fullVersion; } } // 获取应用版本信息的方法 Future getAppVersion() async { try { final packageInfo = await PackageInfo.fromPlatform(); return AppVersionInfo( versionName: packageInfo.version, buildNumber: packageInfo.buildNumber, fullVersion: '${packageInfo.version}+${packageInfo.buildNumber}', ); } catch (e) { // 获取失败时返回默认值 return AppVersionInfo( versionName: '1.0.0', buildNumber: '1', fullVersion: '1.0.0+0', ); } } /// ------------------------------------------------------ /// 全局会话管理 /// ------------------------------------------------------ class SessionService { SessionService._(); static final SessionService instance = SessionService._(); String? corpinfoId; String? loginUserId; Map? loginUser; String? deptId; String? deptLevel; String? postId; String? username; String? version; String? basePath; String? isRest; List? permission; bool updateInfo = false; /// 如果以下任何一项为空,则跳转到登录页 void loginSession(BuildContext context) { if (corpinfoId == null || loginUserId == null || loginUser == null) { Navigator.pushReplacementNamed(context, '/login'); } } // setters void setLoginUser(Map user) => loginUser = user; void setLoginUserId(String id) => loginUserId = id; void setCorpinfoId(String id) => corpinfoId = id; void setDeptId(String id) => deptId = id; void setDeptLevel(String level) => deptLevel = level; void setPostId(String id) => postId = id; void setUsername(String name) => username = name; void setVersion(String ver) => version = ver; void setBasePath(String url) => basePath = url; void setIsRest(String rest) => isRest = rest; void setPermission(List list) => permission = list; void setUpdateInfo(bool flag) => updateInfo = flag; } /// ------------------------------------------------------ /// 日期格式化 /// ------------------------------------------------------ String formatDate(DateTime? date, String fmt) { if (date == null) return ''; String twoDigits(int n) => n.toString().padLeft(2, '0'); final replacements = { 'yyyy': date.year.toString(), 'yy': date.year.toString().substring(2), 'MM': twoDigits(date.month), 'M': date.month.toString(), 'dd': twoDigits(date.day), 'd': date.day.toString(), 'hh': twoDigits(date.hour), 'h': date.hour.toString(), 'mm': twoDigits(date.minute), 'm': date.minute.toString(), 'ss': twoDigits(date.second), 's': date.second.toString(), }; String result = fmt; replacements.forEach((key, value) { result = result.replaceAllMapped(RegExp(key), (_) => value); }); return result; } /// ------------------------------------------------------ /// 防多次点击 /// ------------------------------------------------------ class ClickUtil { ClickUtil._(); static bool _canClick = true; /// 调用示例: /// ClickUtil.noMultipleClicks(() { /* your code */ }); static void noMultipleClicks(VoidCallback fn, {int delayMs = 2000}) { if (_canClick) { _canClick = false; fn(); Future.delayed(Duration(milliseconds: delayMs), () { _canClick = true; }); } else { // 可替换成 Toast debugPrint('请稍后点击'); } } } void presentPage(BuildContext context, Widget page) { Navigator.push( context, MaterialPageRoute(fullscreenDialog: true, builder: (_) => page), ); } class LoadingDialogHelper { static void show(BuildContext context) { showDialog( context: context, barrierDismissible: false, builder: (_) => const Center(child: CircularProgressIndicator()), ); } static void hide(BuildContext context) { if (Navigator.canPop(context)) { Navigator.of(context).pop(); } } }