Skip to content

第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');
  }
}

提升可读性的技巧

  1. 使用描述性的变量名和函数名
  2. 添加注释:为复杂的逻辑添加注释
  3. 保持函数短小:每个函数只做一件事
  4. 使用空白行:分隔不同的逻辑块
  5. 使用枚举:代替魔法数字
  6. 使用类型注解:明确变量和函数的类型

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('<', '&lt;')
        .replaceAll('>', '&gt;')
        .replaceAll('"', '&quot;')
        .replaceAll("'", '&#39;');
  }
}

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 性能优化基础

减少冗余代码

  1. 使用函数和方法:将重复的代码提取为函数
  2. 使用循环:对于重复的操作,使用循环代替多次重复代码
  3. 使用集合操作:使用 map、where、reduce 等方法简化代码
  4. 使用扩展方法:为常用操作创建扩展方法

优化异步操作

  1. 使用 async/await:使异步代码更清晰
  2. 并行执行:使用 Future.wait 并行执行多个异步操作
  3. 避免阻塞:不要在主线程中执行耗时操作
  4. 使用 Stream:对于连续的数据,使用 Stream 而不是多次 Future

内存优化

  1. 避免创建不必要的对象:重用对象而不是每次都创建新对象
  2. 使用 const 构造函数:对于不变的对象,使用 const 构造函数
  3. 及时释放资源:使用 finally 块释放资源
  4. 使用弱引用:对于大型对象,考虑使用弱引用

性能优化示例

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.0
    dart
    import '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.0
    dart
    import '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.0
    dart
    import '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 版本升级与兼容性处理

版本升级步骤

  1. 检查当前版本:运行 dart --version 查看当前版本
  2. 更新 SDK:下载并安装最新版本的 Dart SDK
  3. 更新依赖:运行 dart pub upgrade 更新依赖
  4. 修复兼容性问题:根据编译器提示修复代码

兼容性处理

  1. 空安全迁移

    • 添加 null-safety 到 pubspec.yaml
    • 修复空安全相关的错误
    • 使用 ?!?? 等操作符处理空值
  2. API 变更处理

    • 查看 Dart 官方文档了解 API 变更
    • 替换已废弃的 API
    • 适应新的 API 用法
  3. 依赖版本冲突

    • 指定兼容的依赖版本范围
    • 使用 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

常见兼容性问题及解决方案

  1. 空安全错误:添加空值检查或使用空值安全操作符
  2. 废弃 API:使用新的替代 API
  3. 类型不匹配:添加类型转换或使用正确的类型
  4. 依赖冲突:指定兼容的版本范围

小结

  • 代码规范:遵循命名规范和代码格式,提高代码可读性
  • 工具类封装:封装通用函数、常量和工具方法,提高代码复用性
  • 性能优化:减少冗余代码,优化异步操作,合理使用内存
  • 第三方库:使用成熟的第三方库,提高开发效率
  • 版本升级:及时升级 Dart 版本,处理兼容性问题

通过掌握这些进阶技巧,你可以编写更高效、更可维护的 Dart 代码,提高开发效率和代码质量。

© 2026 编程马·菜鸟教程 版权所有