tools_box 0.1.0
tools_box: ^0.1.0 copied to clipboard
Flutter常用工具集合 - 提供字符串处理、日期格式化、Widget扩展、验证工具等功能
tools_box #
Flutter 常用工具集合,提供字符串处理、日期格式化、Widget 扩展、表单验证等功能,帮助开发者提升开发效率。
✨ Features #
- 🎯 StringUtils - 字符串扩展方法(邮箱/手机号验证、格式化、截断等)
- 📅 DateUtils - 日期时间工具类(格式化、相对时间、日期范围等)
- 🎨 WidgetExtensions - Widget 便捷扩展方法(padding、居中、圆角等)
- 📱 BuildContextExtensions - BuildContext 扩展(屏幕尺寸、SnackBar、导航等)
- ✅ ValidationUtils - 表单验证工具类(邮箱、手机号、密码验证等)
🚀 Getting started #
添加依赖 #
在 pubspec.yaml 文件中添加:
dependencies:
tools_box: ^0.1.0
导入包 #
import 'package:tools_box/tools_box.dart';
📖 Usage #
1️⃣ 字符串工具 (StringUtils) #
import 'package:tools_box/tools_box.dart';
// 邮箱验证
'test@example.com'.isEmail; // true
// 手机号验证(中国手机号)
'13812345678'.isPhoneNumber; // true
// 首字母大写
'hello'.capitalize; // 'Hello'
// 每个单词首字母大写
'hello world'.capitalizeAllOf; // 'Hello World'
// 判断是否为数字
'12345'.isNumeric; // true
// 字符串反转
'flutter'.reverse; // 'rettulf'
// 字符串截断
'这是一个很长的字符串'.truncate(10); // '这是一个很长的字...'
// 移除空白字符
' hello world '.removeWhitespace; // 'helloworld'
// URL验证
'https://example.com'.isURL; // true
// 空字符串转null
''.nullIfEmpty; // null
'hello'.nullIfEmpty; // 'hello'
2️⃣ 日期时间工具 (DateUtils) #
import 'package:tools_box/tools_box.dart';
final now = DateTime.now();
// 格式化日期
DateUtils.formatDate(now); // '2024-01-15'
DateUtils.formatDate(now, pattern: 'yyyy年MM月dd日'); // '2024年01月15日'
// 格式化日期时间
DateUtils.formatDateTime(now); // '2024-01-15 14:30:00'
// 相对时间(中文)
DateUtils.timeAgo(now.subtract(Duration(minutes: 5))); // '5分钟前'
DateUtils.timeAgo(now.subtract(Duration(hours: 2))); // '2小时前'
DateUtils.timeAgo(now.subtract(Duration(days: 1))); // '1天前'
// 判断是否是今天/昨天
DateUtils.isToday(now); // true
DateUtils.isYesterday(now.subtract(Duration(days: 1))); // true
// 获取一天的开始/结束时间
DateUtils.startOfDay(now); // DateTime(2024, 1, 15, 0, 0, 0)
DateUtils.endOfDay(now); // DateTime(2024, 1, 15, 23, 59, 59)
// 生成日期范围列表
final start = DateTime(2024, 1, 1);
final end = DateTime(2024, 1, 5);
final days = DateUtils.daysInRange(start, end); // 返回5天的列表
3️⃣ Widget 扩展方法 (WidgetExtensions) #
import 'package:flutter/material.dart';
import 'package:tools_box/tools_box.dart';
// 快速添加 padding
Text('Hello').paddingAll(16);
Text('Hello').paddingSymmetric(horizontal: 20, vertical: 10);
Text('Hello').only(left: 16, right: 16);
// 居中对齐
Text('Centered').center();
// 对齐方式
Text('Aligned').align(alignment: Alignment.centerRight);
// Expanded 和 Flexible
Container().expand(flex: 1);
Container().flexible(flex: 2, fit: FlexFit.tight);
// 绝对定位
Text('Positioned').positioned(top: 10, left: 10);
// 添加点击事件
Icon(Icons.star).onTap(() => print('clicked!'));
// 设置尺寸
Text('Sized').sizedBox(width: 200, height: 100);
// 圆角裁剪
Image.network(url).clipRRect(radius: 12);
// 添加装饰
Text('Decorated')
.decorated(decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(8),
));
// 透明度
Text('Transparent').opacity(0.5);
// 安全区域
Column(children: [Text('Safe')]).safeArea();
// Hero 动画
Image.asset(photo).hero('photo_hero');
// 提示信息
Icon(Icons.info).tooltip('这是一个提示');
// 控制显隐
Text('Visible').visible(true);
Text('Hidden').visible(false, replacement: SizedBox());
链式调用示例:
Text('链式调用示例')
.paddingAll(16)
.center()
.onTap(() => print('tapped!'))
.decorated(decoration: BoxDecoration(
color: Colors.blue.shade50,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.blue),
));
4️⃣ BuildContext 扩展 (BuildContextExtensions) #
import 'package:flutter/material.dart';
import 'package:tools_box/tools_box.dart';
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 获取屏幕尺寸
final width = context.screenWidth;
final height = context.screenHeight;
// 获取主题数据
final theme = context.theme;
final textTheme = context.textTheme;
final colorScheme = context.colorScheme;
// 判断暗色模式
if (context.isDarkMode) {
// 暗色主题逻辑
}
// 键盘状态
if (context.isKeyboardVisible) {
// 键盘已弹出
}
// 隐藏键盘
context.hideKeyboard();
// 显示 SnackBar
context.showSnackBar('操作成功!');
// 页面导航
context.push((context) => DetailPage());
context.pop();
return Container();
}
}
5️⃣ 表单验证工具 (ValidationUtils) #
import 'package:tools_box/tools_box.dart';
// 基础验证
ValidationUtils.isValidEmail('test@example.com'); // true
ValidationUtils.isValidPhone('13812345678'); // true
ValidationUtils.isValidPassword('123456'); // true
ValidationUtils.isValidURL('https://example.com'); // true
ValidationUtils.isValidIDCard('110101199001011234'); // true
// 表单验证(返回错误消息或 null)
String? error;
error = ValidationUtils.validateEmail('invalid-email');
// 返回: '请输入有效的邮箱地址'
error = ValidationUtils.validateEmail('test@example.com');
// 返回: null (验证通过)
error = ValidationUtils.validatePhone('');
// 返回: '手机号不能为空'
error = ValidationUtils.validatePassword('123', minLength: 6);
// 返回: '密码长度至少需要6位'
error = ValidationUtils.validateRequired('', fieldName: '用户名');
// 返回: '用户名不能为空'
error = ValidationUtils.validateRequired('valid_username', fieldName: '用户名');
// 返回: null (验证通过)
// 其他验证方法
ValidationUtils.isChinese('你好'); // true
ValidationUtils.containsOnlyNumbers('12345'); // true
ValidationUtils.containsOnlyLetters('abc'); // true
ValidationUtils.containsOnlyLettersAndNumbers('abc123'); // true
在 TextFormField 中使用:
TextFormField(
decoration: InputDecoration(labelText: '邮箱'),
validator: (value) => ValidationUtils.validateEmail(value),
)
TextFormField(
decoration: InputDecoration(labelText: '手机号'),
validator: (value) => ValidationUtils.validatePhone(value),
)
TextFormField(
decoration: InputDecoration(labelText: '密码'),
obscureText: true,
validator: (value) => ValidationUtils.validatePassword(value, minLength: 8),
)
🎯 示例应用 #
查看 example_app 目录获取完整的使用示例:
cd example_app
flutter run -d edge
示例应用展示了所有功能模块的实际使用效果。
🔧 开发指南 #
本地开发 #
如果你想参与开发或修改此包:
- 克隆仓库:
git clone https://github.com/yourusername/tools_box.git
cd tools_box
- 安装依赖:
flutter pub get
- 运行测试:
flutter test
- 启动示例应用:
cd example_app
flutter pub get
flutter run
运行测试 #
# 运行所有测试
flutter test
# 运行特定测试文件
flutter test test/tools_box_test.dart
# 生成覆盖率报告
flutter test --coverage
代码规范 #
# 格式化代码
dart format .
# 静态分析
flutter analyze
📊 测试覆盖 #
当前版本包含 11 个单元测试,覆盖所有核心功能模块:
- ✅ StringUtils 测试用例
- ✅ DateUtils 测试用例
- ✅ ValidationUtils 测试用例
运行 flutter test 查看详细测试结果。
🤝 贡献指南 #
欢迎贡献代码!请遵循以下步骤:
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建 Pull Request
代码规范 #
- 遵循 Dart 官方风格指南
- 为公共 API 编写文档注释
- 新增功能必须包含对应的单元测试
- 确保
flutter analyze无错误 - 确保
flutter test全部通过
📝 变更日志 #
查看 CHANGELOG.md 了解版本更新历史。
📄 许可证 #
本项目基于 MIT License 开源。
🙏 致谢 #
感谢所有贡献者和 Flutter 社区!
📞 联系方式 #
- 问题反馈:GitHub Issues
- 功能建议:GitHub Discussions
让 Flutter 开发更简单高效! 🚀