跳到主要内容

接触 Flutter 框架

· 阅读需 6 分钟

Flutter是一款开源的移动应用开发框架,由Google开发和维护。Flutter采用Dart语言编写,具有高效的渲染引擎、丰富的组件库和快速的开发周期,可以用于构建高质量、跨平台的移动应用程序。

为什么关注跨平台方案

做移动端开发绕不开一个现实问题:同一个产品要覆盖 Android 和 iOS,往往意味着两套代码、两套技术栈、双份的维护成本。之前流行的混合方案要么基于 WebView 套壳,性能和体验有明显折损;要么像 React Native 那样把 JS 组件映射到平台原生控件,跨端一致性始终差一口气。

Flutter 走了另一条路:不依赖平台原生控件,UI 完全由自己绘制。这让它在"一套代码、多端一致"这件事上做得比前辈们更彻底,也是我愿意花时间上手它的原因。

渲染引擎

Flutter的渲染引擎采用Skia图形库,可以实现高质量、高性能的绘图和动画效果。Flutter的组件库包含丰富的UI组件,可以轻松创建各种样式的应用程序,并支持自定义组件的开发。Flutter还提供了丰富的API和工具,支持快速的开发周期和高效的调试。

这里值得展开说一下自绘的含义:Flutter 不把界面翻译成各平台的原生控件,而是通过 Skia 直接在画布上把每个像素画出来。平台层只需要提供一块可供绘制的 Surface 和事件输入,剩下的布局、绘制、动画都由 Flutter 引擎自己完成。好处是同一份 UI 代码在不同系统、不同系统版本上渲染结果高度一致,不会因为某个平台控件行为不同而出现差异。

Flutter: 为所有屏幕创造精彩

跨平台能力

Flutter的跨平台特性也是其最大的优势之一,可以同时为Android和iOS开发应用程序,而且开发的应用程序可以在不同的平台上实现相同的用户体验。Flutter还支持Web和桌面应用程序的开发,可以为不同的应用场景提供解决方案。

也就是说,一套代码理论上可以覆盖 Android、iOS、Web,以及 Windows、macOS 这类桌面端。当然,不同目标平台的成熟度并不一样,移动端是 Flutter 最先打磨的主战场;但对于工具类、展示类应用,多端复用带来的成本节约是实打实的。

Dart 语言

Flutter采用Dart语言作为开发语言,Dart是一种面向对象、静态类型的语言,具有强大的类型推断和异步编程支持,可以提高开发效率和代码质量。Flutter的Dart编译器将Dart代码编译为本地代码,可以在不同平台上实现高性能和快速的渲染。

Dart 对 Flutter 来说不只是"顺手选的语言"。它同时支持 JIT 和 AOT 两种编译模式:开发阶段用 JIT,代码改动可以即时生效,支撑起热重载;发布阶段用 AOT 编译成机器码,运行时不需要解释器,性能接近原生。一门语言同时满足开发效率和运行性能两个诉求,这在跨平台框架里并不多见。

写惯 Java 或 JavaScript 的人上手 Dart 几乎没有门槛,语法风格介于两者之间,async/await 的异步写法也很直观。

Widget 组件模型

Flutter的UI框架采用了一种称为"Widget"的组件模型,Widget是Flutter中最基本的构建块,包含了UI元素和逻辑。Flutter中的所有UI元素都是Widget,包括文本、图像、按钮等。Flutter的Widget具有层次结构,可以嵌套和组合,可以自由地创建复杂的UI界面。

"一切皆 Widget"是 Flutter 的核心设计哲学。不仅按钮、文本是 Widget,连内边距(Padding)、居中(Center)、手势识别(GestureDetector)这些"行为"也都是 Widget。复杂界面不靠继承一个庞大的基类来实现,而是靠小 Widget 层层组合——组合优于继承在这里体现得很充分。

Widget 按是否持有可变状态分为两类:StatelessWidget 描述一段不变的 UI;StatefulWidget 配合 State 对象管理会变化的部分,状态一变,框架自动重建对应的 Widget 子树。理解了这一点,Flutter 的声明式 UI 思路基本就通了。

热重载

Flutter的热重载功能可以在开发过程中实时预览UI变化,无需重新编译和部署应用程序,大大提高了开发效率和反馈速度。Flutter还提供了丰富的调试工具和可视化工具,可以帮助开发人员快速定位和解决问题。

热重载的原理是把改动后的源码增量注入到正在运行的 Dart 虚拟机里,然后重建 Widget 树——应用的当前状态得以保留。这意味着调一个深层页面的样式时,不用每次都从首页重新点进去,改完保存,界面直接刷新,调 UI 的体验和原生开发相比是质的提升。

踩坑与注意

上手过程中有几点值得提前知道:

1)国内网络环境下,SDK 下载和 pub 依赖拉取可能会很慢甚至失败,需要配置国内镜像源(设置 PUB_HOSTED_URLFLUTTER_STORAGE_BASE_URL 环境变量)。

2)Widget 嵌套写深了之后代码可读性下降明显,建议尽早养成拆分小 Widget 的习惯,而不是在一个 build 方法里堆几百行。

3)涉及平台原生能力(如蓝牙、推送)时,需要通过 Platform Channel 与原生代码通信,这部分仍然要求一定的 Android/iOS 原生知识。

4)热重载并非万能:改动涉及全局状态初始化、main 方法或枚举等场景时需要热重启(hot restart)甚至完整重新编译。

提示

第一次运行 flutter doctor 时按提示把环境缺失项逐一补齐,能省掉后面大量莫名其妙的构建报错。

小结

感觉Flutter框架确实很不错,提供了优良的组件,配合Dart语言开发入门非常快。简单写了几个demo之后已经可以正式进行app开发,一套代码跑Android、iOS、Windows桌面程序、Mac都可以。自绘渲染保证了多端一致性,Widget 组合的写法清晰直观,热重载让调 UI 不再痛苦。对想尝试跨平台开发的人来说,Flutter 是一个值得认真投入的选项。

评论 / COMMENTS