0
点赞
收藏
分享

微信扫一扫

Dart语言基础实战练习与常见问题解析(2025超详细版)

第一章 开发环境与工具链
1.1 Dart SDK安装与验证
安装Dart SDK是开发的第一步,需注意以下要点:

  1. 访问官网选择对应操作系统的安装包
  2. 配置环境变量(Windows需手动添加,Mac/Linux通过brew或apt安装)
  3. 终端验证安装:dart --version,成功显示版本号如Dart 2.19.6即安装成功
    常见问题:
    • 环境变量未生效:重启终端或使用source ~/.bash_profile刷新配置

• 版本冲突:使用dvm(Dart版本管理器)管理多版本

1.2 IDE配置与插件
推荐使用Visual Studio Code:

  1. 安装Dart插件(提供代码提示、调试支持)
  2. 安装Flutter插件(集成开发环境)
  3. 配置settings.json优化开发体验:

{
  "dart.lineLength": 120,
  "dart.previewFlutterUiGuides": true
}

第二章 基础语法实战演练
2.1 变量与常量
• 动态类型推断:var name = 'Dart'(自动识别为String)

• 空安全机制:变量默认不可空,需显式声明可空性:

int? nullableAge = null; // 可空类型
String nonNullableName = '小明'; // 非空类型

• 常量声明:

const PI = 3.14; // 编译时常量
final currentTime = DateTime.now(); // 运行时常量

2.2 流程控制
条件分支:

String checkRain(bool isRaining) {
  return isRaining ? '带伞' : '无需带伞'; // 三元表达式
}

循环控制:

// for-in遍历集合
var fruits = ['苹果', '香蕉'];
for (var fruit in fruits) {
  print('水果:$fruit');
}

// while处理动态条件
int count = 0;
while (count < 5) {
  print('计数:${count++}');
}

2.3 集合操作
• 列表高级操作:

var numbers = [1, 2, 3];
numbers
  .map((n) => n * 2) // 转换为[2,4,6]
  .where((n) => n > 3) // 过滤出[4,6]
  .forEach(print);

• Map的键值处理:

var capitals = {'中国': '北京', '日本': '东京'};
capitals.update('美国', (v) => '华盛顿', ifAbsent: () => '华盛顿');

第三章 函数与类实战
3.1 函数式编程
• 命名参数与可选参数:

void printUser({required String name, int age = 18}) {
  print('$name ($age岁)');
}
// 调用:printUser(name: '李雷', age: 20);

• 匿名函数应用:

var add = (int a, int b) => a + b;
list.sort((a, b) => a.compareTo(b));

3.2 面向对象开发
类与继承:

class Animal {
  String name;
  Animal(this.name); // 构造方法
  void run() => print('$name在奔跑');
}

class Cat extends Animal {
  Cat(String name) : super(name); // 调用父类构造
  @override
  void run() {
    super.run();
    print('并且会爬树');
  }
}

工厂构造函数:

class Logger {
  static final Logger _instance = Logger._internal();
  factory Logger() => _instance; // 单例模式
  Logger._internal();
}

第四章 异步编程实战
4.1 Future与async/await
• 网络请求模拟:

Future<String> fetchUserData() async {
  await Future.delayed(Duration(seconds: 2)); // 模拟延迟
  return '{"name": "王芳", "age": 25}';
}

void main() async {
  try {
    var data = await fetchUserData();
    print('获取数据:$data');
  } catch (e) {
    print('请求失败:$e');
  }
}

4.2 Stream应用
• 实时数据流处理:

Stream<int> timedCounter(Duration interval, int maxCount) async* {
  int count = 0;
  while (count < maxCount) {
    await Future.delayed(interval);
    yield count++;
  }
}

void main() {
  timedCounter(Duration(seconds: 1), 5)
    .listen((count) => print('计数:$count'));
}

第五章 项目实战:待办事项应用
5.1 功能需求
• 添加/删除任务

• 标记完成状态

• 数据持久化存储

• 分类过滤功能

5.2 核心实现
数据模型:

class TodoItem {
  final String id;
  String title;
  bool isCompleted;
  DateTime createTime;

  TodoItem({
    required this.title,
    this.isCompleted = false,
  }) : id = uuid.v4(), 
       createTime = DateTime.now();
}

状态管理:

class TodoList {
  final List<TodoItem> _items = [];
  
  void addItem(String title) {
    _items.add(TodoItem(title: title));
  }

  void toggleComplete(String id) {
    var item = _items.firstWhere((i) => i.id == id);
    item.isCompleted = !item.isCompleted;
  }
}

文件存储:

Future<void> saveData(List<TodoItem> items) async {
  final file = File('todo.json');
  await file.writeAsString(jsonEncode(items));
}

第六章 高频问题解析
6.1 类型转换错误

// 错误示例
var input = '123a';
int value = int.parse(input); // 抛出FormatException

// 正确处理
int? safeParse(String input) {
  return int.tryParse(input) ?? 0;
}

6.2 异步嵌套陷阱

// 反模式:回调地狱
fetchUser().then((user) {
  fetchOrders(user.id).then((orders) {
    // 多层嵌套...
  });
});

// 优化方案:async/await
void loadData() async {
  var user = await fetchUser();
  var orders = await fetchOrders(user.id);
  // 线性代码结构
}

6.3 空安全异常

// 错误:可能触发空指针
String? name;
print(name.length);

// 正确处理
if (name != null) {
  print(name.length);
}
// 或使用空安全运算符
print(name?.length ?? 0);

6.4 平台兼容性问题
• 文件路径差异:

// 跨平台路径处理
var path = Platform.isAndroid 
  ? '/storage/emulated/0/data'
  : '${Directory.current.path}/data';

• 网络请求库选择:Web端使用dart:html的HttpRequest,移动端使用dart:io的HttpClient

举报

相关推荐

0 条评论