1. 变量与常量
// 变量声明
var name = 'Flutter'; // 类型推断
String name = 'Flutter'; // 显式声明
dynamic dynamicValue = '可变类型'; // 运行时确定类型
// 常量
final finalValue = '运行时常量'; // 运行时赋值一次
const constValue = '编译时常量'; // 编译时确定值,const集合内容不可变
2. 空安全(必考!)
String? nullableString; // 可空类型
String nonNullableString = ''; // 非空类型
// 安全访问
nullableString?.length; // 安全调用运算符
nullableString!.length; // 断言非空(需确保不为null)
// 空合并运算符
String result = nullableString ?? '默认值';
nullableString ??= '默认值'; // 如果为null则赋值
3. 集合类型
// List
List<int> numbers = [1, 2, 3];
var list = [1, 2, 3]; // 类型推断
List<int> fixedList = List.filled(3, 0); // 固定长度
// Set
Set<String> names = {'Alice', 'Bob'};
// Map
Map<String, int> scores = {'Alice': 95, 'Bob': 87};
4. 函数(重要!)
// 基本函数
int add(int a, int b) => a + b; // 箭头函数
// 可选参数
void printInfo(String name, [int? age]) {} // 位置可选
void printInfo2({String? name, int? age}) {} // 命名可选
// 默认值
void greet({String name = 'Guest'}) {}
// 高阶函数
void process(List<int> list, int Function(int) fn) {
list.map(fn);
}
5. 面向对象
// 类定义
class Person {
String name;
int age;
// 构造函数
Person(this.name, this.age); // 简化构造函数
// 命名构造函数
Person.anonymous() : name = 'Anonymous', age = 0;
// 工厂构造函数
factory Person.fromJson(Map<String, dynamic> json) {
return Person(json['name'], json['age']);
}
// 方法
void introduce() => print('I am $name, $age years old');
}
// 继承
class Student extends Person {
String major;
Student(String name, int age, this.major) : super(name, age);
}
// 混入(Mixin)
mixin Swimmer {
void swim() => print('Swimming');
}
class Athlete extends Person with Swimmer {}
6. 异步编程(重点!)
// Future
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 1));
return 'Data loaded';
}
// 错误处理
Future<void> loadData() async {
try {
var data = await fetchData();
} catch (e) {
print('Error: $e');
} finally {
print('Complete');
}
}
// Stream
Stream<int> countStream(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i; // 生成流数据
}
}
三、Flutter特有概念
1. Widget核心概念
// Stateful vs Stateless
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container();
}
}
class CounterWidget extends StatefulWidget {
@override
_CounterWidgetState createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _count = 0;
void _increment() {
setState(() {
_count++;
});
}
}
2. 生命周期方法
// StatefulWidget生命周期
initState() // 初始化状态
didChangeDependencies() // 依赖变化
build() // 构建UI
didUpdateWidget() // Widget更新
dispose() // 销毁
四、面试常见问题
理论题:
-
Dart是单线程,如何实现异步?
- 事件循环机制
- async/await原理
- isolate多线程
-
const和final的区别?
- const编译时常量
- final运行时常量
-
Stream与Future的区别?
- Future:单次异步操作
- Stream:多次异步事件流
-
混入(Mixin)与继承的区别?
- 继承:单继承,is-a关系
- 混入:多混入,功能复用
代码题:
- 实现一个Dart单例
class Singleton {
static final Singleton _instance = Singleton._internal();
factory Singleton() => _instance;
Singleton._internal(); // 私有构造函数
}
- 异步顺序执行
Future<void> sequentialTasks() async {
await task1();
await task2();
await task3();
}
- 错误处理
Future<void> safeOperation() async {
try {
await riskyOperation();
} on TimeoutException {
print('Timeout');
} on CustomException catch (e) {
print('Custom: $e');
}
}
五、学习建议
-
重点掌握:
- 空安全规范
- Future/async/await
- Widget生命周期
- BuildContext理解
-
实践建议:
- 自己实现常见的Widget
- 理解setState机制
- 掌握状态管理(Provider/Bloc等)
-
面试准备:
- 能解释Dart的事件循环
- 理解Widget树和Element树的关系
- 掌握常见优化技巧