Flutter 常用工具类大全:路由、加密、日期、字符串、文件等

在 Flutter 开发中,工具类是提高代码复用性和开发效率的关键。本文将介绍 Flutter 中常用的工具类,包括:

  1. 路由工具类:支持带参数的路由跳转和参数获取。
  2. 对称加密工具类:使用 AES 算法实现数据加密和解密。
  3. 非对称加密工具类:使用 RSA 算法实现数据加密和解密。
  4. 日期工具类:日期格式化、解析、计算日期差等。
  5. 字符串工具类:字符串判空、截取、格式化等。
  6. 文件工具类:文件读写、路径获取等。
  7. 网络工具类:检查网络状态、发送网络请求等。
  8. 颜色工具类:颜色转换、生成随机颜色等。
  9. 日志工具类:统一管理日志输出。
  10. 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 开发有所帮助!

相关推荐
仙魁XAN1 小时前
Flutter 学习之旅 之 flutter 不使用插件,实现简单自定义弹窗PopupDialog功能
flutter·提示·弹窗·toast·popupdialog
仙魁XAN1 小时前
Flutter 学习之旅 之 flutter 在设备上进行 全面屏 设置/隐藏状态栏/隐藏导航栏 设置
前端·学习·flutter
一人前行3 小时前
Flutter_学习记录_barcode_scan2 实现扫描条形码、二维码
flutter
顾林海4 小时前
Flutter Dart 面向对象编程全面解析
android·前端·flutter
Ever6913 小时前
Flutter三棵树是什么,为什么这么设计
flutter·三棵树
萧鼎1 天前
Flutter 从入门到进阶:构建跨平台应用的最佳实践
flutter
一人前行1 天前
Flutter_学习记录_connectivity_plus 检测网络
flutter
顾林海1 天前
Flutter Dart 异常处理全面解析
android·前端·flutter
程序员老刘1 天前
从gitee上的鸿蒙开源Flutter停止更新说起
flutter·harmonyos