最佳实践建议
代码风格
命名约定
dart
// 类:大驼峰命名法
class UserProfile {}
// 变量、函数:小驼峰命名法
String userName = 'Alice';
void calculateTotal() {}
// 常量:小驼峰命名法
const maxRetries = 3;
const apiEndpoint = 'https://api.example.com';
// 私有成员:下划线前缀
class BankAccount {
double _balance;
}
// 库:小写加下划线
import 'package:my_app/user_service.dart';使用类型注解
dart
// 好
String getName() => 'Alice';
List<int> getNumbers() => [1, 2, 3];
// 避免
getName() => 'Alice'; // 类型不清楚优先使用 final 而不是 var
dart
// 好
final name = 'Alice';
final numbers = [1, 2, 3];
// 不太推荐
var name = 'Alice';空安全
dart
// 始终安全地处理空值
String? getName() => null;
void main() {
// 好
String name = getName() ?? '访客';
// 好
String? maybeName = getName();
if (maybeName != null) {
print(maybeName.toUpperCase());
}
// 避免
// String name = getName()!; // 有风险!
}函数
保持函数简短
dart
// 好 - 单一职责
bool isValidEmail(String email) {
return email.contains('@') && email.contains('.');
}
bool isAdult(int age) {
return age >= 18;
}
// 避免 - 做太多事情
void processUser(Map user) {
// 100 行代码...
}使用命名参数
dart
// 好
void createUser({
required String name,
required String email,
int age = 0,
}) {}
// 不太清晰
void createUser(String name, String email, int age) {}集合
使用集合字面量
dart
// 好
var list = <int>[];
var map = <String, int>{};
var set = <String>{};
// 避免
var list = List<int>();
var map = Map<String, int>();使用集合 If/For
dart
// 好
var numbers = [
1,
2,
if (includeThree) 3,
for (var i in extras) i,
];
// 避免
var numbers = [1, 2];
if (includeThree) numbers.add(3);
for (var i in extras) numbers.add(i);类
使用初始化形式参数
dart
// 好
class Point {
final double x, y;
Point(this.x, this.y);
}
// 避免
class Point {
final double x, y;
Point(double x, double y) {
this.x = x;
this.y = y;
}
}优先使用组合而不是继承
dart
// 好
class Car {
final Engine engine;
Car(this.engine);
}
// 不太灵活
class Car extends Engine {}异步编程
始终使用 async/await
dart
// 好
Future<String> fetchData() async {
var response = await http.get(url);
return response.body;
}
// 避免
Future<String> fetchData() {
return http.get(url).then((response) {
return response.body;
});
}处理错误
dart
Future<void> loadData() async {
try {
var data = await fetchData();
processData(data);
} catch (e) {
print('错误:$e');
}
}性能
使用 const 构造函数
dart
// 好 - 只创建一次
const icon = Icon(Icons.home);
// 效率较低 - 每次都创建
final icon = Icon(Icons.home);文档
为公共 API 编写文档
dart
/// 计算圆的面积。
///
/// [radius] 必须为正数。
/// 返回 double 类型的面积。
double calculateCircleArea(double radius) {
assert(radius > 0, '半径必须为正数');
return 3.14159 * radius * radius;
}测试
编写测试
dart
import 'package:test/test.dart';
void main() {
test('加法有效', () {
expect(2 + 2, equals(4));
});
test('字符串包含子字符串', () {
expect('你好,世界', contains('世界'));
});
}总结
- 遵循命名约定
- 使用类型注解以提高清晰度
- 拥抱空安全
- 保持函数小巧且专注
- 使用命名参数以提高清晰度
- 优先使用
const和final - 正确处理错误
- 为公共 API 编写文档
- 编写测试
- 使用 linter(analysis_options.yaml)