1-Flutter分享
Flutter简介
Flutter 是 Google 推出并开源的移动应用开发框架,帮助开发者通过一套代码库高效构建多平台应用,支持 iOS、Android、Web、Windows、macOS、Linux、Fuchsia
优点
- 跨平台:增加代码复用,降低开发成本
- 性能:Flutter直接将Dart代码编译为本地代码运行,再调用skia绘图引擎代码,和原生一样,这就少了像reactnative和weex等先转为原生控件,再系统渲染的步骤
- 热重载:修改完代码后 Ctrl+S 就能实时展现在真机界面上,不需要重新安装 apk 包,提高开发效率


Impeller
Impeller 是 Flutter 团队新开发的 **渲染引擎 (renderer)**,专门替代之前的 Skia 渲染管线。
- 目标是 更低的延迟、更流畅的动画、更稳定的性能。
- 特别是为了解决 iOS 上的 jank(掉帧卡顿) 问题。
| 对比点 | Skia (旧) | Impeller (新) |
|---|---|---|
| 渲染管线 | 通用 2D 引擎(Skia) | Flutter 专属优化管线 |
| Shader | 运行时编译 → 可能掉帧 | 预编译 shader,无需运行时编译 |
| 平台支持 | OpenGL / Metal / Vulkan(跨平台) | 目前主要支持 Metal (iOS)、Vulkan (Android 部分设备),逐步扩展 |
| 性能 | 动画掉帧可能性高,尤其在 iOS | 更低延迟,几乎无 shader jank |
| 稳定性 | 已经很成熟,但 Flutter 需要做额外适配 | 更适配 Flutter 绘制模型(比如曲线、图层合成等) |
| 目标 | 通用图形库 | 专为 Flutter 设计的渲染后端 |
| ![[Pasted image 20250917102231.png]] |
缺点
1.脱离不开原生,一些功能不支持,需要原生开发
2.适配问题,可能会有各种各样的适配问题
3.基础库不完善,需要自己写
在现阶段,开始尝试探索和积累沉淀 Flutter 技术能力,逐步的完善,flutter还是值得尝试一下的,毕竟研发效率就是竞争力。
现状
现在的很多 app 都有进行 flutter 的功能,这是“国内大厂应用在移动端 Flutter 框架使用分析”,地址链接:https://juejin.cn/post/7012382656578977806。
常用网址
Widget
Activity、Fragment、view 在 Flutter 中等价于 Widget.
与 Android view 区别
- Android 中 View 是可变的,当用户交互或数据更新时,可直接调用 View 的 invalidate 方法重绘,达到更新 UI 的目的。
- Flutter 的 widget 是不可改变的因此不能直接更新,而必须使用 Widget 的状态。Flutter 的 widget 分为有状态和无状态两种。
Stateful widgets
Stateless widgets 是不可变的, 这意味着它们的属性不能改变,所有的值都是最终的.
Stateful widgets(有状态的部件) 持有的状态可能在 widget 生命周期中发生变化. 实现一个 stateful widget 至少需要两个类:
- 一个 StatefulWidget 类。
- 一个 State 类。 StatefulWidget 类本身是不变的,但是 State 类在 widget 生命周期中始终存在.
stateful widget 将自身的构建委托给 State 对象,State 对象的 build 函数负责构建该 Widget,当用户交互或数据发生变化时,Widget 状态发生改变,调用 State 的 setState 方法通知它,而后 State 根据当前的状态信息,重新构建 Widget tree
- 在 Android 中,您可以从父级控件调用 addChild 或 removeChild 以动态添加或删除 View。在 Flutter 中,因为 widget 是不可变的,所以没有 addChild。相反,您可以传入一个函数,该函数返回一个 widget 给父项,并通过 布尔值控制该 widget 的创建
- 在 Flutter 中,一个自定义 widget 通常是通过组合其它 widget 来实现的,而不是继承
- 某些 widget 属性需要单个 widget(child),而其它一些属性,如 action,需要一组 widgets (children),用方括号[]表示。
生命周期
- 初始化:
initState() - 依赖变化:
didChangeDependencies() - 构建 UI:
build() - 更新时机:
didUpdateWidget() - 销毁:
dispose()
👉 一句话总结:
StatefulWidget 生命周期 = initState → build → (setState → build 循环) → dispose
这里的重点是 StatefulWidget,因为 StatelessWidget 没有生命周期,只有一次 build。
Flutter 生命周期分层
在 Flutter 里,生命周期不是 Widget 本身,而是 State 对象的生命周期
- Widget:描述 UI 的配置数据,不可变(immutable)。
- Element:Widget 在 Widget Tree 里的位置表示,负责管理 Widget 和 RenderObject。
- State:和 StatefulWidget 绑定,保存可变状态,生命周期由框架管理。
所以我们平时说的“生命周期”,其实就是 State 的生命周期。
statefulWidget 的生命周期方法
创建阶段
createState()- 在 StatefulWidget 创建时调用,只执行一次。
- 返回一个
State对象。
initState()- 在 State 对象插入到树中时调用(只执行一次)。
- 常用于初始化数据、订阅事件、启动动画。
- ⚠️ 不能在这里调用
BuildContext依赖 InheritedWidget 的东西(比如Theme.of(context)),因为 State 还没完全挂到树上。
依赖变化阶段
didChangeDependencies()
- 在 initState() 之后立即调用一次。
- 当依赖的 InheritedWidget(如 Theme、Locale)发生变化时再次调用。
- 可以安全地使用 BuildContext。
构建阶段build(BuildContext context)
- Widget 的核心方法。
- 每次调用 setState(),都会重新执行 build(),重新构建 UI。
- ⚠️ 这里只应该做 UI 构建,避免耗时操作。
更新阶段didUpdateWidget(covariant OldWidget oldWidget)
- 当父组件重建时,如果传给当前 Widget 的配置数据发生变化,会触发这个方法。
- 适合在这里比较新旧 Widget 的差异,并做相应更新。
销毁阶段deactivate()
- 当 State 从树中移除时调用。
- 可能会再次插入树中(比如在 TabBar 切换时),所以不是最终销毁。
dispose()
- 当 State 被永久移除时调用。
- 用于释放资源:取消订阅、关闭 AnimationController、清理 Timer 等。
- ⚠️ 调用后,这个 State 就不再可用。
常用Widget和属性
Container:父 view,宽高、背景色、圆角、margin
Padding:EdgeInsets. fromLTRB
Center:居中
TextField:输入框(TextEditingController)
Expanded:填充剩余布局,组件有个参数 flex, 可以实现比例分配。
height 如果不设置界面显示会有问题,如果要设置,又不能准确的计算出结果, 可以使用 ExpandedBoxDecoration: 圆角,需要放在 Container 里,实现边框、圆角、阴影、形状、渐变、背景图像
ShapeDecoration: 实现四个边分别指定颜色和宽度、底部线、矩形边色、圆形边色、体育场(竖向椭圆)、角形(八边角)边色
UnderlineTabindicator: 下划线
EdgeInsets. only
symmetric ({vertical, horizontal}):用于设置对称方向的填充,vertical 指 top 和 bottom,horizontal 指 left 和 right。Flutter 中官方提供 CustomScrollView,让我们能够作何 Appbar 折叠的效果,并且很容易就能实现下拉刷新和加载更多。
dialog 高度设置不生效将 showBottomsheet 更换成 showAdjustableBottomSheet
MediaQuery. removePadding 可以移除组件的边距,有些组件自带有边距
expenand 必须和 colum 或 row 一起用,否则 debug 能运行,release 报错。
1 | |

点击
- 在 Flutter 中,添加触摸监听器有两种方法: 如果 Widget 支持事件监听,则可以将一个函数传递给它并进行处理。例如,RaisedButton 有一个 onPressed 参数
- 如果 Widget 不支持事件监听,则可以将该 Widget 包装到 GestureDetector 中,并将处理函数传递给 onTap 参数。
- InkWell:点击,和 GestureDetector区别,即使 InkWell 没有子控件,它仍然可以响应点击操作并执行相应的操作或触发回调函数。
MaterialApp
MaterialApp 是我们使用 Flutter 开发中最常用的符合 Material Design 设计理念的入口 Widget。你可以将它类比成为网页中的