从概念上看,Flutter 架构由三层构成:
按照设计,Flutter 控制在屏幕上绘制的每个像素。Flutter 框架提供了一组丰富的 UI 组件(称为小部件),它们与 iOS 和 Android 上的原生 UI 控件非常匹配。
其中,framework层中的每一个组件均是可选的和可以代替的。Framework是本节要关注的部分。从下到上,其主要包括:
Flutter框架是一个分层的结构,每个层都建立在前一层之上。
最下层embedder,提供五个thread,将引擎移植到平台的中间层代码 渲染设置,原生插件,打包,线程管理,事件循环交互操作。
主要对应engine里面shell相关模块,common是对外的统一接口,gpu是gpu相关的统一接口,platform下面的对应的不同平台的支撑,分辨是哦android,darwin,embedder,fuchsia,glfw,linux,windows,common。其次是profiling,性能调优方面的支持。
虽然一般的架构概念适用于Flutter支持的所有平台,但Flutter的Web支持有一些独特的特点值得讨论。
Dart自从JavaScript语言存在以来就一直在编译成JavaScript,其工具链针对开发和生产目的进行了优化。许多重要的应用程序从Dart编译成JavaScript,并在今天的生产中运行,包括Google Ads的广告商工具。因为Flutter框架是用Dart编写的,所以编译成JavaScript相对简单。
然而,用C++编写的Flutter引擎被设计成与底层操作系统而非网络浏览器的接口。因此,需要采用不同的方法。在网络上,Flutter在标准浏览器API之上提供了引擎的重新实现。目前,我们有两种选择来渲染网络上的Flutter内容。HTML和WebGL。在HTML模式下,Flutter使用HTML、CSS、Canvas和SVG。为了渲染到WebGL,Flutter使用了一个编译成WebAssembly的Skia版本,称为CanvasKit。虽然HTML模式提供了最好的代码大小特性,但CanvasKit提供了最快的路径到浏览器的图形堆栈,并提供了一些更高的图形保真度与本地移动目标5。
也许与Flutter运行的其他平台相比,最显著的区别是,Flutter不需要提供Dart运行时。相反,Flutter框架(以及你编写的任何代码)被编译成JavaScript。值得注意的是,Dart在所有模式中很少有语言语义上的差异(JIT与AOT,native与web编译),大多数开发者永远不会写一行代码碰到这样的差异。
在开发的时候,Flutter web使用的是dartdevc,这是一个支持增量编译的编译器,因此允许应用程序的热重启(虽然目前还不能热重载)。相反,当你准备为web创建一个生产应用时,使用dart2js,Dart的高度优化的生产JavaScript编译器,将Flutter核心和框架与你的应用一起打包成一个最小化的源文件,可以部署到任何web服务器。代码可以在一个文件中提供,也可以通过延迟导入分割成多个文件。
Flutter 使用声明式编程模型。Flutter 小部件通过覆盖 build()
方法来定义它们的 UI,该方法是将状态转换为 UI 的函数:
UI = f(状态)
小型、单一用途的小部件组合在一起以创建更复杂、更专业的小部件来代表您的应用程序 UI。因此,整个应用程序由一个所谓的widget-tree 表示。例如,这是默认 Flutter 计数器应用程序的小部件树的简化版本:
MyApp
MaterialApp
MyHomePage
Scaffold
appBar: AppBar
title: Text
body: Center
Column
Text
Text
floatingActionButton: FloatingActionButton
Icon
在接下来有关状态管理的课程中,我们将讨论如何在状态更改时重建 UI ,以及可以使用哪些技术来重建 UI 。但现在这就是你需要的全部理论。如果你想更深入地解释 Flutter 架构,没有比官方文档更好的地方了:
这是一篇很长的文章,但如果您想了解 Flutter 的底层工作原理,则值得一读。更实用的东西。
当你创建一个新的 Flutter 项目时,会为你生成一些文件和文件夹。
android/
ios/
lib/
main.dart
macos/
test/
web/
.packages
pubspec.yaml
README.md
最重要的文件称为pubspec.yaml
. 这用于指定应用程序的依赖项。这些资源解释了此文件的工作原理以及如何使用它来安装软件包:
除此之外,我强烈建议为您的项目启用linting。最简单的方法是安装官方?flutter_lints软件包。这包含一组推荐的 Flutter 应用程序、包和插件的 lint,以鼓励良好的编码实践。另请参阅?所有受支持规则的列表和说明。推荐的 lint 规则对于大多数项目来说已经足够了。如果您愿意,可以通过添加
analysis_options.yaml
文件来自定义 lint 规则。这是有关它的深入指南:
特别是,请阅读最后的“轻松管理 lint 规则”部分。这解释了如何创建一组干净且可维护的规则,您可以在应用程序中调整这些规则。
当你开始一个新的 Flutter 项目时,启用 linter 规则是你可以做的最好的事情之一。但是,如果您想构建一些具有后端、多个环境等功能的严肃应用程序,则需要考虑更多事项。这是一个有用的规则:
如果你想偷工减料,节省一些开发时间,你可以在你的项目中使用
代码生成。有一系列不同的工具可供使用,无论是处理本地化、资产、解析 JSON、生成模型类、实现服务定位器、路由还是使用不可变状态。唯一要做的就是调查可用的工具和包,并选择最好的工具和包来满足您的项目需求。为了快速启动 Flutter 项目,我建议查看[
?非常好的 CLI。它可以为您节省几个小时的配置时间(不幸的是,我是通过艰难的方式学会的)。