Flutter 基础详解
image.png
- dart:是一种面向对象语言,dart是flutter的程序开发语言。
- main函数:是程序运行的入口函数
-
runApp函数:是渲染根widget树的函数
一般情况下runApp函数会在main函数里执行
语言的主要特点是什么?
- 面向对象:支持类和单继承
- 强类型:但支持类型推断
- 异步编程:内置 Future 和 Stream 支持
- 空安全:支持非空类型检查
- JIT 和 AOT:支持即时编译和提前编译
widget
widget在flutter里基本是一些UI组件
有两种类型的widget:
statefulWidget:会自己重新构建自己(可以改变状态,通过 setState() 触发重建)
statelessWidget:不可变,一旦创建就不能改变
布局Widget:Container、Row、Column、Stack等。
常用Widget:Text、Image、ListView、GridView等。
StatefulWidget:通过setState管理状态。
状态管理方案:Provider、Riverpod、Bloc、GetX等状态管理工具。
Flutter 中的生命周期
- StatelessWidget:
build() - StatefulWidget:
创建/初始化:createState()、initState()
依赖:didChangeDependencies()
构建:build()「每次父Widget重新构建时都会调用此方法」
更新:didUpdateWidget()
失活:deactivate() 「当应用从后台切换到前台时」
清理:dispose() 「清理资源、取消订阅、关闭流等」
状态管理
Flutter 中有哪些状态管理方案?
基础方案:setState
中级方案:InheritedWidget、Provider
高级方案:Riverpod、BLC、Redux、MobX、GetX
Provider 的工作原理是什么?
Provider 是基于 InheritedWidget 的封装,它允许在 Widget 树中高效地共享数据。当数据变化时,只有依赖该数据的 Widget 会重建。
什么是 BLC 模式?
BLC (Business Logic Component) 是一种状态管理模式,它将业务逻辑与 UI 分离,使用 Stream 和 Sink 来处理数据流。
什么是 BuildContext?
BuildContext 是 Widget 在树中位置的句柄(上下文联系的桥梁),用于:
- 查找父 Widget 或主题
- 导航 (Navigator.of(context))
- 显示对话框等
Hot Reload 和 Hot Restart 有什么区别吗?
Hot Reload比Hot Restart快
Hot Reload:会编译我们文件里新加的代码并发送给dart虚拟机,dart会更新widgets来改变UI,会保留之前的state。
Hot Restart:会让dart 虚拟机重新编译应用。Hot Restart会重置所有的state回到初始值。
异步编程:理解Stream,掌握async和await。
包管理:学习如何使用pubspec.yaml管理依赖。
Stream
Stream 用来处理连续的异步操作,Stream 是一个抽象类,用于表示一序列异步数据的源。它是一种产生连续事件的方式,可以生成数据事件或者错误事件,以及流结束时的完成事件
Stream 分单订阅流和广播流。
网络状态的监控
Dart 中的 final 和 const 有什么区别?
- const:编译时常量,必须在编译时就知道值
-
final:运行时常量,只能赋值一次
布局与样式
常见的布局 Widget 有哪些?
Container:通用容器,可设置 padding/margin/decoration
Row/Column:水平和垂直布局
Stack:重叠布局
ListView/GridView:滚动列表
Flex/Expanded:弹性布局
如何实现响应式布局?
使用 MediaQuery.of(context) 获取屏幕尺寸
使用 LayoutBuilder 获取约束条件
使用 Flexible 和 Expanded 弹性布局
使用百分比或弹性布局
使用 OrientationBuilder 处理横竖屏变化
什么是 Theme?
Theme 是 Flutter 中统一管理应用样式的方式,可以定义颜色、字体、按钮样式等,并在整个应用中保持一致。
路由与导航
如何在 Flutter 中实现导航?
'//导航到新页面'
Navigator.push(context, MaterialPageRoute(builder: (context) => NewPage()));
'//返回上一页'
Navigator.pop(context);
命名路由如何配置?
MaterialApp(
routes: {
'/': (context) => HomePage(),
'/details': (context) => DetailsPage(),
},
);
解释 Dart 中的异步编程
Dart 使用 Future 和 async/await 处理异步操作:
Future<String> fetchData() async {
var response = await http.get('https://api.example.com/data');
return response.body;
}
网络与存储
如何进行网络请求?使用 http 包:
var response = await http.get(Uri.parse('https://api.example.com/data'));
Flutter 中的数据存储选项有哪些?
SharedPreferences:简单的键值对存储
SQLite:关系型数据库 (使用 sqflite 包)
Hive:轻量级 NoSQL 数据库
Firebase:云存储解决方案
性能优化
1. 如何优化 Flutter 应用性能?
使用 const Widget 减少重建
避免在 build 方法中进行耗时操作
使用 ListView.builder 处理长列表
减少 Widget 树的深度
使用性能分析工具 (Flutter DevTools)
2. 什么是 Widget 重建?如何避免不必要的重建?
Widget 重建是 Flutter 响应状态变化的机制。避免不必要重建的方法:
使用 const 构造函数
将不常变化的部分拆分为独立的 Widget
使用 Provider 等状态管理工具精确控制重建范围
Flutter 应用如何打包发布?
'//Android:'
flutter build appbundle
或
flutter build apk
//'iOS'
flutter build ios