Appearance
第17章:Dart 进阶技巧(提升开发效率)
17.1 Dart 代码规范
命名规范
- 类名:使用大驼峰命名法(PascalCase),例如
UserManager - 函数名:使用小驼峰命名法(camelCase),例如
getUserInfo - 变量名:使用小驼峰命名法(camelCase),例如
userName - 常量名:使用全大写字母,单词之间用下划线分隔,例如
MAX_LENGTH - 私有成员:使用下划线开头,例如
_privateMethod - 文件名:使用小写字母,单词之间用下划线分隔,例如
user_manager.dart
代码格式
- 缩进:使用 2 个空格进行缩进
- 每行长度:尽量保持每行不超过 80 个字符
- 空行:在函数之间、类成员之间添加空行
- 括号:使用大括号,即使只有一行代码
- 空格:在运算符前后、逗号后添加空格
代码风格示例
dart
// 正确的命名和格式
class UserManager {
static const int MAX_USERS = 100;
String _userName;
int _userAge;
UserManager(this._userName, this._userAge);
String get userName => _userName;
void updateUserInfo(String name, int age) {
_userName = name;
_userAge = age;
_logUpdate();
}
void _logUpdate() {
print('User updated: $_userName, $_userAge');
}
}
// 错误的命名和格式
class user_manager {
static const int max_users = 100;
String username;
int userage;
user_manager(this.username, this.userage){}
void updateuserinfo(String name, int age) {
username=name; userage=age;
logupdate();
}
void logupdate() {
print('User updated: $username, $userage');
}
}提升可读性的技巧
- 使用描述性的变量名和函数名
- 添加注释:为复杂的逻辑添加注释
- 保持函数短小:每个函数只做一件事
- 使用空白行:分隔不同的逻辑块
- 使用枚举:代替魔法数字
- 使用类型注解:明确变量和函数的类型
17.2 常用工具类封装
通用函数
dart
// 工具类示例
class Utils {
// 格式化日期
static String formatDate(DateTime date) {
return '${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}';
}
// 格式化时间
static String formatTime(DateTime date) {
return '${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}:${date.second.toString().padLeft(2, '0')}';
}
// 生成随机字符串
static String generateRandomString(int length) {
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
return List.generate(length, (index) => chars[Random().nextInt(chars.length)]).join();
}
// 验证邮箱格式
static bool isValidEmail(String email) {
final emailRegex = RegExp(r'^[^\s@]+@[^\s@]+\.[^\s@]+$');
return emailRegex.hasMatch(email);
}
// 验证手机号码格式
static bool isValidPhone(String phone) {
final phoneRegex = RegExp(r'^1[3-9]\d{9}$');
return phoneRegex.hasMatch(phone);
}
}常量
dart
// 常量类示例
class Constants {
// API 端点
static const String API_BASE_URL = 'https://api.example.com';
static const String API_LOGIN = '/auth/login';
static const String API_USERS = '/users';
// 存储键
static const String STORAGE_TOKEN = 'user_token';
static const String STORAGE_USER_INFO = 'user_info';
// 状态码
static const int STATUS_SUCCESS = 200;
static const int STATUS_ERROR = 500;
static const int STATUS_UNAUTHORIZED = 401;
// 动画 duration
static const Duration ANIMATION_DURATION = Duration(milliseconds: 300);
// 分页
static const int PAGE_SIZE = 20;
}工具方法
dart
// 扩展方法示例
extension StringExtension on String {
// 首字母大写
String capitalize() {
if (isEmpty) return this;
return this[0].toUpperCase() + substring(1);
}
// 移除空白字符
String trimAll() {
return replaceAll(RegExp(r'\s+'), '');
}
// 转义 HTML
String escapeHtml() {
return replaceAll('&', '&')
.replaceAll('<', '<')
.replaceAll('>', '>')
.replaceAll('"', '"')
.replaceAll("'", ''');
}
}
extension ListExtension<T> on List<T> {
// 安全获取元素
T? getOrNull(int index) {
return index >= 0 && index < length ? this[index] : null;
}
// 随机获取元素
T? getRandomElement() {
if (isEmpty) return null;
return this[Random().nextInt(length)];
}
// 去重
List<T> distinct() {
return toSet().toList();
}
}17.3 Dart 性能优化基础
减少冗余代码
- 使用函数和方法:将重复的代码提取为函数
- 使用循环:对于重复的操作,使用循环代替多次重复代码
- 使用集合操作:使用 map、where、reduce 等方法简化代码
- 使用扩展方法:为常用操作创建扩展方法
优化异步操作
- 使用 async/await:使异步代码更清晰
- 并行执行:使用 Future.wait 并行执行多个异步操作
- 避免阻塞:不要在主线程中执行耗时操作
- 使用 Stream:对于连续的数据,使用 Stream 而不是多次 Future
内存优化
- 避免创建不必要的对象:重用对象而不是每次都创建新对象
- 使用 const 构造函数:对于不变的对象,使用 const 构造函数
- 及时释放资源:使用 finally 块释放资源
- 使用弱引用:对于大型对象,考虑使用弱引用
性能优化示例
dart
// 优化前
void processUsers(List<User> users) {
for (var i = 0; i < users.length; i++) {
var user = users[i];
if (user.age > 18) {
print('Adult: ${user.name}');
}
}
}
// 优化后
void processUsers(List<User> users) {
users
.where((user) => user.age > 18)
.forEach((user) => print('Adult: ${user.name}'));
}
// 并行执行异步操作
Future<void> fetchData() async {
var futures = [
fetchUsers(),
fetchPosts(),
fetchComments()
];
var results = await Future.wait(futures);
// 处理结果
}17.4 第三方库推荐
网络请求
- dio:功能强大的 HTTP 客户端,支持拦截器、超时、重试等yaml
dependencies: dio: ^5.0.0dartimport 'package:dio/dio.dart'; void fetchData() async { var dio = Dio(); var response = await dio.get('https://api.example.com/users'); print(response.data); }
本地存储
- shared_preferences:简单的键值对存储yaml
dependencies: shared_preferences: ^2.0.0dartimport 'package:shared_preferences/shared_preferences.dart'; void saveUserData() async { var prefs = await SharedPreferences.getInstance(); await prefs.setString('userName', 'Alice'); await prefs.setInt('userAge', 25); }
JSON 序列化
- json_serializable:自动生成 JSON 序列化代码yaml
dependencies: json_annotation: ^4.0.0 dev_dependencies: build_runner: ^2.0.0 json_serializable: ^4.0.0dartimport 'package:json_annotation/json_annotation.dart'; @JsonSerializable() class User { final String id; final String name; final int age; User({required this.id, required this.name, required this.age}); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
状态管理
- provider:简单的状态管理库yaml
dependencies: provider: ^6.0.0
路由管理
- go_router:声明式路由管理yaml
dependencies: go_router: ^5.0.0
工具库
- flutter_secure_storage:安全存储敏感信息
- intl:国际化和本地化
- logger:日志记录
- fluttertoast:Toast 提示
17.5 Dart 版本升级与兼容性处理
版本升级步骤
- 检查当前版本:运行
dart --version查看当前版本 - 更新 SDK:下载并安装最新版本的 Dart SDK
- 更新依赖:运行
dart pub upgrade更新依赖 - 修复兼容性问题:根据编译器提示修复代码
兼容性处理
空安全迁移:
- 添加
null-safety到 pubspec.yaml - 修复空安全相关的错误
- 使用
?、!、??等操作符处理空值
- 添加
API 变更处理:
- 查看 Dart 官方文档了解 API 变更
- 替换已废弃的 API
- 适应新的 API 用法
依赖版本冲突:
- 指定兼容的依赖版本范围
- 使用
dependency_overrides解决冲突
版本升级示例
yaml
# pubspec.yaml
name: my_app
description: A new Flutter project.
# 空安全
environment:
sdk: '>=2.17.0 <3.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
# 指定兼容版本
http: ^1.0.0
shared_preferences: ^2.0.0
# 解决依赖冲突
dependency_overrides:
http: ^1.0.0常见兼容性问题及解决方案
- 空安全错误:添加空值检查或使用空值安全操作符
- 废弃 API:使用新的替代 API
- 类型不匹配:添加类型转换或使用正确的类型
- 依赖冲突:指定兼容的版本范围
小结
- 代码规范:遵循命名规范和代码格式,提高代码可读性
- 工具类封装:封装通用函数、常量和工具方法,提高代码复用性
- 性能优化:减少冗余代码,优化异步操作,合理使用内存
- 第三方库:使用成熟的第三方库,提高开发效率
- 版本升级:及时升级 Dart 版本,处理兼容性问题
通过掌握这些进阶技巧,你可以编写更高效、更可维护的 Dart 代码,提高开发效率和代码质量。
