在 Flutter 开发中,工具类是提高代码复用性和开发效率的关键。本文将介绍 Flutter 中常用的工具类,包括:
- 路由工具类:支持带参数的路由跳转和参数获取。
- 对称加密工具类:使用 AES 算法实现数据加密和解密。
- 非对称加密工具类:使用 RSA 算法实现数据加密和解密。
- 日期工具类:日期格式化、解析、计算日期差等。
- 字符串工具类:字符串判空、截取、格式化等。
- 文件工具类:文件读写、路径获取等。
- 网络工具类:检查网络状态、发送网络请求等。
- 颜色工具类:颜色转换、生成随机颜色等。
- 日志工具类:统一管理日志输出。
- SharedPreferences 工具类:简化本地存储操作。
通过封装这些工具类,开发者可以更高效地完成日常开发任务。
正文
1. 路由工具类
支持带参数的路由跳转和参数获取。
实现代码
import 'package:flutter/material.dart';class NavigatorUtil {// 跳转到新页面(带参数)static void pushWithParams(BuildContext context, Widget page, {dynamic arguments}) {Navigator.push(context,MaterialPageRoute(builder: (context) => page,settings: RouteSettings(arguments: arguments),),);}// 从路由中获取参数static dynamic getRouteArgs(BuildContext context) {return ModalRoute.of(context)?.settings.arguments;}// 跳转到新页面并替换当前页面(带参数)static void pushReplacementWithParams(BuildContext context, Widget page, {dynamic arguments}) {Navigator.pushReplacement(context,MaterialPageRoute(builder: (context) => page,settings: RouteSettings(arguments: arguments),),);}// 跳转到新页面并清除所有历史页面(带参数)static void pushAndRemoveUntilWithParams(BuildContext context, Widget page, {dynamic arguments}) {Navigator.pushAndRemoveUntil(context,MaterialPageRoute(builder: (context) => page,settings: RouteSettings(arguments: arguments),),(route) => false,);}
}
2. 对称加密工具类
使用 AES 算法实现数据加密和解密。
安装依赖
在 pubspec.yaml
中添加 encrypt
插件:
dependencies:encrypt: ^5.0.0
实现代码
import 'package:encrypt/encrypt.dart';class SymmetricCryptoUtil {static final key = Key.fromUtf8('32characterslongpassphrase1234'); // 32字符密钥static final iv = IV.fromUtf8('16characterslong'); // 16字符IV// 加密static String encrypt(String plainText) {final encrypter = Encrypter(AES(key));final encrypted = encrypter.encrypt(plainText, iv: iv);return encrypted.base64;}// 解密static String decrypt(String encryptedText) {final encrypter = Encrypter(AES(key));final decrypted = encrypter.decrypt64(encryptedText, iv: iv);return decrypted;}
}
3. 非对称加密工具类
使用 RSA 算法实现数据加密和解密。
安装依赖
在 pubspec.yaml
中添加 pointycastle
插件:
dependencies:pointycastle: ^3.4.0
实现代码
import 'dart:convert';
import 'package:pointycastle/export.dart';class AsymmetricCryptoUtil {// 生成 RSA 密钥对static AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey> generateKeyPair() {final keyGen = RSAKeyGenerator()..init(ParametersWithRandom(RSAKeyGeneratorParameters(BigInt.parse('65537'), 2048, 64),SecureRandom(),));return keyGen.generateKeyPair();}// 使用公钥加密static String encrypt(String plainText, RSAPublicKey publicKey) {final encryptor = OAEPEncoding(RSAEngine())..init(true, PublicKeyParameter<RSAPublicKey>(publicKey));final encrypted = encryptor.process(utf8.encode(plainText));return base64.encode(encrypted);}// 使用私钥解密static String decrypt(String encryptedText, RSAPrivateKey privateKey) {final decryptor = OAEPEncoding(RSAEngine())..init(false, PrivateKeyParameter<RSAPrivateKey>(privateKey));final decrypted = decryptor.process(base64.decode(encryptedText));return utf8.decode(decrypted);}
}
4. 日期工具类
用于日期格式化、解析、计算日期差等操作。
实现代码
import 'package:intl/intl.dart';class DateUtil {// 格式化日期static String formatDate(DateTime date, {String format = 'yyyy-MM-dd'}) {return DateFormat(format).format(date);}// 解析字符串为日期static DateTime parseDate(String dateString, {String format = 'yyyy-MM-dd'}) {return DateFormat(format).parse(dateString);}// 计算两个日期之间的天数差static int getDaysBetween(DateTime startDate, DateTime endDate) {return endDate.difference(startDate).inDays;}// 判断两个日期是否为同一天static bool isSameDay(DateTime date1, DateTime date2) {return date1.year == date2.year &&date1.month == date2.month &&date1.day == date2.day;}// 获取当前时间的字符串static String getCurrentTime({String format = 'yyyy-MM-dd HH:mm:ss'}) {return formatDate(DateTime.now(), format: format);}// 获取某一天的开始时间(00:00:00)static DateTime getStartOfDay(DateTime date) {return DateTime(date.year, date.month, date.day);}// 获取某一天的结束时间(23:59:59)static DateTime getEndOfDay(DateTime date) {return DateTime(date.year, date.month, date.day, 23, 59, 59);}
}
5. 字符串工具类
用于字符串的常用操作,如判空、截取、格式化等。
实现代码
class StringUtil {// 判断字符串是否为空static bool isEmpty(String? str) {return str == null || str.isEmpty;}// 判断字符串是否不为空static bool isNotEmpty(String? str) {return !isEmpty(str);}// 首字母大写static String capitalize(String str) {if (isEmpty(str)) return '';return str[0].toUpperCase() + str.substring(1);}// 去除空格static String trim(String str) {return str.trim();}// 忽略大小写判断是否包含static bool containsIgnoreCase(String str, String search) {return str.toLowerCase().contains(search.toLowerCase());}// 截取字符串static String substring(String str, int start, [int? end]) {if (isEmpty(str)) return '';return str.substring(start, end);}// 判断是否为邮箱格式static bool isEmail(String str) {final emailRegex = RegExp(r'^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$');return emailRegex.hasMatch(str);}// 判断是否为手机号格式static bool isPhoneNumber(String str) {final phoneRegex = RegExp(r'^[0-9]{10,11}$');return phoneRegex.hasMatch(str);}
}
6. 文件工具类
用于文件读写、路径获取等操作。
实现代码
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';class FileUtil {// 获取应用文档目录路径static Future<String> getAppDocumentsPath() async {Directory directory = await getApplicationDocumentsDirectory();return directory.path;}// 写入文件static Future<File> writeFile(String path, String content) async {final file = File(path);return file.writeAsString(content);}// 读取文件static Future<String> readFile(String path) async {final file = File(path);return file.readAsString();}// 复制资源文件到指定路径static Future<void> copyAssetToFile(String assetPath, String targetPath) async {final byteData = await rootBundle.load(assetPath);final file = File(targetPath);await file.writeAsBytes(byteData.buffer.asUint8List());}// 判断文件是否存在static Future<bool> isFileExists(String path) async {return File(path).exists();}// 删除文件static Future<void> deleteFile(String path) async {final file = File(path);if (await file.exists()) {await file.delete();}}
}
7. 网络工具类
用于检查网络状态、发送网络请求等。
实现代码
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:dio/dio.dart';class NetworkUtil {// 检查网络是否连接static Future<bool> isConnected() async {var connectivityResult = await Connectivity().checkConnectivity();return connectivityResult != ConnectivityResult.none;}// 发送 GET 请求static Future<String> fetchData(String url) async {final response = await Dio().get(url);if (response.statusCode == 200) {return response.data.toString();} else {throw Exception('Failed to load data');}}// 发送 POST 请求static Future<String> postData(String url, Map<String, dynamic> data) async {final response = await Dio().post(url, data: data);if (response.statusCode == 200) {return response.data.toString();} else {throw Exception('Failed to post data');}}
}
8. 颜色工具类
用于颜色转换、生成随机颜色等。
实现代码
import 'dart:math';
import 'package:flutter/material.dart';class ColorUtil {// 将十六进制字符串转换为颜色static Color hexToColor(String hex) {hex = hex.replaceAll('#', '');if (hex.length == 6) {hex = 'FF$hex'; // 添加透明度}return Color(int.parse(hex, radix: 16));}// 将颜色转换为十六进制字符串static String colorToHex(Color color) {return '#${color.value.toRadixString(16).substring(2)}';}// 生成随机颜色static Color getRandomColor() {return Color.fromARGB(255,Random().nextInt(256),Random().nextInt(256),Random().nextInt(256),);}// 调整颜色亮度static Color adjustBrightness(Color color, double factor) {return Color.fromARGB(color.alpha,(color.red * factor).clamp(0, 255).toInt(),(color.green * factor).clamp(0, 255).toInt(),(color.blue * factor).clamp(0, 255).toInt(),);}
}
9. 日志工具类
用于统一管理日志输出。
实现代码
class LogUtil {// 调试日志static void debug(String message) {print('[DEBUG] $message');}// 信息日志static void info(String message) {print('[INFO] $message');}// 错误日志static void error(String message, {dynamic error}) {print('[ERROR] $message');if (error != null) {print(error);}}
}
10. SharedPreferences 工具类
用于简化本地存储操作。
实现代码
import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesUtil {// 保存字符串static Future<void> saveString(String key, String value) async {final prefs = await SharedPreferences.getInstance();await prefs.setString(key, value);}// 获取字符串static Future<String?> getString(String key) async {final prefs = await SharedPreferences.getInstance();return prefs.getString(key);}// 删除键值对static Future<void> remove(String key) async {final prefs = await SharedPreferences.getInstance();await prefs.remove(key);}// 保存布尔值static Future<void> saveBool(String key, bool value) async {final prefs = await SharedPreferences.getInstance();await prefs.setBool(key, value);}// 获取布尔值static Future<bool?> getBool(String key) async {final prefs = await SharedPreferences.getInstance();return prefs.getBool(key);}
}
总结
本文整理了 Flutter 开发中常用的工具类,包括路由、加密、日期、字符串、文件、网络、颜色、日志和本地存储等功能。通过封装这些工具类,开发者可以显著提高代码的复用性和开发效率。希望本文对您的 Flutter 开发有所帮助!