import 'dart:math'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:ui/providers/APIs.dart'; import 'dart:io' show Platform; class Utils { static Future showAlertDialog(BuildContext context, String msg) async { return showDialog( context: context, barrierDismissible: true, // user must tap button! builder: (BuildContext context) { return AlertDialog( title: const Text('警告 ⚠️'), content: SingleChildScrollView( child: ListBody( children: [ Text(msg), ], ), ), actions: [ TextButton( child: const Text('确定'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); } } showSnakeBar(String msg) { final context = APIs.navigatorKey.currentContext; if (context != null) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(msg), showCloseIcon: true, )); } } extension FileFormatter on num { String readableFileSize({bool base1024 = false}) { final base = base1024 ? 1024 : 1000; if (this <= 0) return "0"; final units = ["B", "kB", "MB", "GB", "TB"]; int digitGroups = (log(this) / log(base)).floor(); return "${NumberFormat("#,##0.#").format(this / pow(base, digitGroups))} ${units[digitGroups]}"; } } bool isDesktop() { return Platform.isLinux || Platform.isWindows || Platform.isMacOS; } bool isSmallScreen(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; return screenWidth < 600; }