Flutter 基础

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()        // 销毁

四、面试常见问题

理论题:

  1. Dart是单线程,如何实现异步?

    • 事件循环机制
    • async/await原理
    • isolate多线程
  2. const和final的区别?

    • const编译时常量
    • final运行时常量
  3. Stream与Future的区别?

    • Future:单次异步操作
    • Stream:多次异步事件流
  4. 混入(Mixin)与继承的区别?

    • 继承:单继承,is-a关系
    • 混入:多混入,功能复用

代码题:

  1. 实现一个Dart单例
class Singleton {
  static final Singleton _instance = Singleton._internal();
  
  factory Singleton() => _instance;
  
  Singleton._internal();  // 私有构造函数
}
  1. 异步顺序执行
Future<void> sequentialTasks() async {
  await task1();
  await task2();
  await task3();
}
  1. 错误处理
Future<void> safeOperation() async {
  try {
    await riskyOperation();
  } on TimeoutException {
    print('Timeout');
  } on CustomException catch (e) {
    print('Custom: $e');
  }
}

五、学习建议

  1. 重点掌握

    • 空安全规范
    • Future/async/await
    • Widget生命周期
    • BuildContext理解
  2. 实践建议

    • 自己实现常见的Widget
    • 理解setState机制
    • 掌握状态管理(Provider/Bloc等)
  3. 面试准备

    • 能解释Dart的事件循环
    • 理解Widget树和Element树的关系
    • 掌握常见优化技巧
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容