在 Flutter 开发中,工具类是提高代码复用性和开发效率的关键。本文将介绍 Flutter 中常用的工具类,包括:
- 路由工具类:支持带参数的路由跳转和参数获取。
- 对称加密工具类:使用 AES 算法实现数据加密和解密。
- 非对称加密工具类:使用 RSA 算法实现数据加密和解密。
- 日期工具类:日期格式化、解析、计算日期差等。
- 字符串工具类:字符串判空、截取、格式化等。
- 文件工具类:文件读写、路径获取等。
- 网络工具类:检查网络状态、发送网络请求等。
- 颜色工具类:颜色转换、生成随机颜色等。
- 日志工具类:统一管理日志输出。
- SharedPreferences 工具类:简化本地存储操作。
通过封装这些工具类,开发者可以更高效地完成日常开发任务。
正文
1. 路由工具类
支持带参数的路由跳转和参数获取。
实现代码
dart
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
插件:
yaml
dependencies:
encrypt: ^5.0.0
实现代码
dart
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
插件:
yaml
dependencies:
pointycastle: ^3.4.0
实现代码
dart
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. 日期工具类
用于日期格式化、解析、计算日期差等操作。
实现代码
dart
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. 字符串工具类
用于字符串的常用操作,如判空、截取、格式化等。
实现代码
dart
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. 文件工具类
用于文件读写、路径获取等操作。
实现代码
dart
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. 网络工具类
用于检查网络状态、发送网络请求等。
实现代码
dart
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. 颜色工具类
用于颜色转换、生成随机颜色等。
实现代码
dart
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. 日志工具类
用于统一管理日志输出。
实现代码
dart
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 工具类
用于简化本地存储操作。
实现代码
dart
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 开发有所帮助!