常见问题解答
- 简介
- Flutter 提供什么?
- 技术
- 功能
- 我可以期待什么样的应用性能?
- 我可以期待什么样的开发者周期?从编辑到刷新需要多长时间?
- 热重载与热重启有何不同?
- 我可以在哪里部署我的 Flutter 应用?
- Flutter 可以在哪些设备和操作系统版本上运行?
- Flutter 是否可以在网络上运行?
- 我可以用 Flutter 构建桌面应用吗?
- 我可以在我现有的原生应用中使用 Flutter 吗?
- 我是否可以访问平台服务和 API,如传感器和本地存储?
- 我是否可以扩展和自定义捆绑的窗口小部件?
- 为什么我想在 iOS 和 Android 上共享布局代码?
- 我是否可以与我的移动平台的默认编程语言进行互操作?
- Flutter 是否附带反射/镜像系统?
- 如何在 Flutter 中进行国际化 (i18n)、本地化 (l10n) 和无障碍访问 (a11y)?
- 如何为 Flutter 编写并行和/或并发应用?
- 我可以在 Flutter 应用的后台运行 Dart 代码吗?
- 我可以用 Flutter 使用 JSON/XML/protobuffers(等等)吗?
- 我可以用 Flutter 构建 3D(OpenGL)应用吗?
- 为什么我的 APK 或 IPA 这么大?
- Flutter 应用是否可以在 Chromebook 上运行?
- Flutter 是否 ABI 兼容?
- 框架
- 项目
简介
此页面收集了一些关于 Flutter 的常见问题。您还可以查看以下专门的常见问题解答
什么是 Flutter?
Flutter 是 Google 的便携式 UI 工具包,用于从单个代码库为移动设备、网络和桌面电脑制作精美的原生编译应用程序。Flutter 可与现有代码配合使用,全球的开发者和组织都在使用它,而且它是免费且开源的。
Flutter 适用于谁?
对于用户而言,Flutter 让精美的应用程序栩栩如生。
对于开发者而言,Flutter 降低了构建应用程序的门槛。它加快了应用程序开发速度,并降低了跨平台应用程序制作的成本和复杂性。
对于设计师而言,Flutter 提供了一个用于打造高端用户体验的画布。Fast Company 将 Flutter 描述为 十年来最重要的设计理念之一,因为它能够将概念转化为产品代码,而不会受到典型框架施加的限制。它还充当了一个高效的原型制作工具,其中包含拖放工具(如 FlutterFlow)和基于网络的 IDE(如 Zapp!)。
对于工程经理和企业而言,Flutter 允许将应用程序开发者统一到一个 移动设备、网络和桌面应用程序团队 中,利用单个代码库为多个平台构建品牌应用程序。Flutter 加快了功能开发速度,并同步了整个客户群的发布计划。
使用 Flutter 需要多少开发经验?
Flutter 适用于熟悉面向对象概念(类、方法、变量等)和命令式编程概念(循环、条件语句等)的程序员。
我们已经看到,一些几乎没有编程经验的人学习并使用 Flutter 来进行原型制作和应用程序开发。
使用 Flutter 可以构建哪些类型的应用?
Flutter 旨在支持在 Android 和 iOS 上运行的移动应用,以及您希望在网页或桌面上运行的交互式应用。
需要提供高度品牌化设计的应用特别适合 Flutter。但是,您还可以使用 Flutter 创建与 Android 和 iOS 设计语言相匹配的像素级体验。
Flutter 的 软件包生态系统支持各种硬件(例如摄像头、GPS、网络和存储)和服务(例如支付、云存储、身份验证和 广告)。
谁制作了 Flutter?
Flutter 是一个开源项目,由 Google 和其他公司及个人提供支持。
谁在使用 Flutter?
Google 内外的开发者使用 Flutter 为 iOS 和 Android 构建漂亮的原生编译应用。要了解其中一些应用,请访问 展示。
是什么让 Flutter 独一无二?
Flutter 与大多数其他构建移动应用的选项不同,因为它不依赖于 Web 浏览器技术,也不依赖于每台设备附带的小部件集。相反,Flutter 使用自己的高性能渲染引擎来绘制小部件。
此外,Flutter 的不同之处在于它只有一层薄薄的 C/C++ 代码。Flutter 在 Dart(一种现代、简洁的面向对象语言)中实现了其大部分系统(合成、手势、动画、框架、小部件等),开发者可以轻松地阅读、更改、替换或删除。这给了开发者对系统的巨大控制权,同时也大大降低了大多数系统可接近性的门槛。
我应该使用 Flutter 构建我的下一个生产应用吗?
Flutter 1 于 2018 年 12 月 4 日发布,Flutter 2 于 2021 年 3 月 3 日发布,Flutter 3 于 2023 年 5 月 10 日发布。截至 2023 年 5 月,已有超过一百万个应用使用 Flutter 在数亿台设备上发布。在 展示中查看一些示例应用。
Flutter 大约每季度发布一次更新,以提高稳定性和性能,并解决用户常见请求的功能。
Flutter 提供什么?
Flutter SDK 中有什么?
Flutter 包括
- 针对移动设备进行了高度优化的 2D 渲染引擎,对文本提供了卓越的支持
- 现代 react 风格框架
- 实现了 Material Design 和 iOS 风格的丰富小部件集
- 单元和集成测试的 API
- 与系统和第三方 SDK 连接的互操作和插件 API
- 用于在 Windows、Linux 和 Mac 上运行测试的无头测试运行器
- Flutter DevTools(也称为 Dart DevTools),用于测试、调试和分析你的应用
- 用于创建、构建、测试和编译你的应用的命令行工具
Flutter 是否适用于任何编辑器或 IDE?
我们为 VS Code、Android Studio 和 IntelliJ IDEA 提供了插件。请参阅 编辑器配置 了解设置详情,以及 VS Code 和 Android Studio/IntelliJ 了解如何使用插件的提示。
或者,你可以使用终端中的 flutter
命令,以及支持 编辑 Dart 的众多编辑器之一。
Flutter 是否附带框架?
是的!Flutter 附带一个现代 react 风格框架。Flutter 的框架被设计为分层且可自定义(且可选)。开发人员可以选择仅使用框架的部分,甚至完全替换框架的上层。
Flutter 是否附带小部件?
是的!Flutter 附带一组 高质量的 Material Design 和 Cupertino(iOS 风格)小部件、布局和主题。当然,这些小部件只是起点。Flutter 的设计让您可以轻松创建自己的小部件或自定义现有小部件。
Flutter 是否支持 Material Design?
是的!Flutter 和 Material 团队紧密合作,Material 得到全面支持。有关更多信息,请查看 小部件目录中的 Material 2 和 Material 3 小部件。
Flutter 是否附带测试框架?
是的,Flutter 提供用于编写单元测试和集成测试的 API。详细了解 使用 Flutter 进行测试。
我们使用自己的测试功能来测试我们的 SDK,并且我们衡量每次提交的 测试覆盖率。
Flutter 是否附带调试工具?
是的,Flutter 附带 Flutter DevTools(也称为 Dart DevTools)。有关更多信息,请参阅 使用 Flutter 进行调试和 Flutter DevTools 文档。
Flutter 是否附带依赖注入框架?
我们不提供固执己见的解决方案,但有各种软件包提供依赖注入和服务定位,例如 injectable、get_it、kiwi 和 riverpod。
技术
Flutter 使用什么技术构建的?
Flutter 使用 C、C++、Dart、Skia(2D 渲染引擎)和 Impeller(iOS 上的默认渲染引擎)构建。请参阅此 架构图 以更好地了解主要组件。有关 Flutter 分层架构的更详细描述,请阅读 架构概述。
Flutter 如何在 Android 上运行我的代码?
引擎的 C 和 C++ 代码使用 Android 的 NDK 进行编译。Dart 代码(SDK 和您的代码)被提前(AOT)编译成本机、ARM 和 x86 库。这些库包含在“运行器”Android 项目中,而整个项目被构建成 .apk
。启动时,该应用会加载 Flutter 库。任何渲染、输入或事件处理等都委派给已编译的 Flutter 和应用代码。这与许多游戏引擎的工作方式类似。
在调试模式下,Flutter 使用虚拟机 (VM) 运行其代码,以启用有状态热重载,此功能让您无需重新编译即可对正在运行的代码进行更改。在此模式下运行时,您会在应用的右上角看到一个“调试”横幅,提醒您性能并非成品发布应用的特征。
Flutter 如何在 iOS 上运行我的代码?
引擎的 C 和 C++ 代码使用 LLVM 进行编译。Dart 代码(SDK 和您的代码)被提前(AOT)编译成本机 ARM 库。该库包含在“运行器”iOS 项目中,而整个项目被构建成 .ipa
。启动时,该应用会加载 Flutter 库。任何渲染、输入或事件处理等都委派给已编译的 Flutter 和应用代码。这与许多游戏引擎的工作方式类似。
在调试模式下,Flutter 使用虚拟机 (VM) 运行其代码,以启用有状态热重载,此功能让您无需重新编译即可对正在运行的代码进行更改。在此模式下运行时,您会在应用的右上角看到一个“调试”横幅,提醒您性能并非成品发布应用的特征。
Flutter 是否使用我的操作系统内置平台小组件?
否。相反,Flutter 提供了一组小组件(包括 Material Design 和 Cupertino(iOS 风格)小组件),由 Flutter 的框架和引擎管理和渲染。您可以浏览 Flutter 小组件目录。
我们相信最终结果是更高质量的应用。如果我们重复使用内置平台小组件,Flutter 应用的质量和性能将受到这些小组件的灵活性和质量的限制。
例如,在 Android 中,有一组硬编码的手势和用于消除歧义的固定规则。在 Flutter 中,您可以编写自己的手势识别器,它是 手势系统 中的一级参与者。此外,由不同人员创作的两个小部件可以协调消除手势歧义。
现代应用设计趋势表明,设计师和用户希望拥有更多动态丰富的 UI 和品牌优先的设计。为了实现这种级别的定制化、美观设计,Flutter 被设计为驱动像素,而不是内置小部件。
通过使用相同的渲染器、框架和一组小部件,可以从相同的代码库发布到多个平台,而无需进行仔细且昂贵的规划来对齐不同的功能集和 API 特性。
通过为所有代码使用单一语言、单一框架和单一库集(无论您的 UI 是否因平台而异),我们还旨在帮助降低应用开发和维护成本。
当我的移动操作系统更新并引入新小部件时会发生什么?
Flutter 团队关注 iOS 和 Android 新移动小部件的采用和需求,并旨在与社区合作构建对新小部件的支持。此项工作可能以较低级别的框架特性、新的可组合小部件或新小部件实现的形式出现。
Flutter 的分层架构旨在支持大量小部件库,我们鼓励和支持社区构建和维护小部件库。
当我的移动操作系统更新并引入新平台功能时会发生什么?
Flutter 的互操作和插件系统旨在允许开发者立即访问新的移动操作系统特性和功能。开发者不必等待 Flutter 团队公开新的移动操作系统功能。
我可以使用哪些操作系统来构建 Flutter 应用?
Flutter 支持使用 Linux、macOS、ChromeOS 和 Windows 进行开发。
Flutter 用什么语言编写?
Dart,一种快速发展的现代语言,针对客户端应用进行了优化。底层图形框架和 Dart 虚拟机在 C/C++ 中实现。
为什么 Flutter 选择使用 Dart?
在最初的开发阶段,Flutter 团队研究了很多语言和运行时,最终为框架和小组件采用了 Dart。Flutter 使用四个主要维度进行评估,并考虑了框架作者、开发者和最终用户需求。我们发现很多语言满足了一些要求,但 Dart 在我们所有的评估维度中得分很高,并满足了我们所有的要求和标准。
Dart 运行时和编译器支持将两个关键特性组合到 Flutter 中:基于 JIT 的快速开发周期,允许在具有类型的语言中进行形状更改和有状态热重载,以及一个提前编译器,它会发出高效的 ARM 代码,以实现快速启动和可预测的生产部署性能。
此外,我们有机会与 Dart 社区紧密合作,该社区正在积极投入资源来改进 Dart 在 Flutter 中的使用。例如,当我们采用 Dart 时,该语言没有用于生成本机二进制文件的提前工具链,这对于实现可预测的高性能至关重要,但现在该语言有了,因为 Dart 团队为 Flutter 构建了它。同样,Dart VM 以前针对吞吐量进行了优化,但现在该团队正在针对延迟优化 VM,这对 Flutter 的工作负载来说更为重要。
Dart 在以下主要标准中得分很高
- 开发者生产力
- Flutter 的主要价值主张之一是,它通过让开发者使用相同的代码库为 iOS 和 Android 创建应用,从而节省了工程资源。使用高生产力语言可以进一步加快开发者的速度,并使 Flutter 更具吸引力。这对我们的框架团队和我们的开发者来说都非常重要。Flutter 的大部分都是使用我们提供给用户的相同语言构建的,因此我们需要在 100k 行代码中保持生产力,同时不牺牲框架和小组件对我们开发者的可接近性或可读性。
- 面向对象
- 对于 Flutter,我们想要一种适合 Flutter 问题域的语言:创建可视用户体验。该行业在面向对象语言中构建用户界面框架方面拥有数十年的经验。虽然我们可以使用非面向对象语言,但这意味着要重新发明轮子来解决几个难题。此外,绝大多数开发者都有面向对象开发的经验,这使得学习如何使用 Flutter 开发变得更容易。
- 可预测的高性能
- 借助 Flutter,我们希望赋能开发者,让他们能够创造快速、流畅的用户体验。为了实现这一点,我们需要在每个动画帧期间运行大量最终开发者代码。这意味着我们需要一门既能提供高性能,又能提供可预测性能的语言,而不会出现导致丢帧的周期性暂停。
- 快速分配
- Flutter 框架使用功能性风格的流程,它严重依赖于底层内存分配器高效处理小而短暂的分配。这种风格是在具有此特性的语言中开发的,并且在缺乏此特性的语言中无法高效工作。
Flutter 能否运行任何 Dart 代码?
Flutter 可以运行不会直接或间接导入 dart:mirrors
或 dart:html
的 Dart 代码。
Flutter 引擎有多大?
2021 年 3 月,我们测量了 极简 Flutter 应用(无 Material 组件,仅一个 Center
小部件,使用 flutter build apk --split-per-abi
构建)的下载大小,将其打包并压缩为发布 APK,对于 ARM32 约为 4.3 MB,对于 ARM64 约为 4.8 MB。
在 ARM32 上,核心引擎约为 3.4 MB(已压缩),框架 + 应用代码约为 765 KB(已压缩),LICENSE 文件为 58 KB(已压缩),必要的 Java 代码(classes.dex
)为 120 KB(已压缩)。
在 ARM64 上,核心引擎约为 4.0 MB(已压缩),框架 + 应用代码约为 659 KB(已压缩),LICENSE 文件为 58 KB(已压缩),必要的 Java 代码(classes.dex
)为 120 KB(已压缩)。
这些数字是使用 apkanalyzer 测量的,它也 内置于 Android Studio 中。
在 iOS 上,同一应用的发布 IPA 在 iPhone X 上的下载大小为 10.9 MB,如 Apple 的 App Store Connect 所报告。IPA 比 APK 大,主要是因为 Apple 在 IPA 中对二进制文件进行加密,从而降低了压缩效率(请参阅 Apple 的 iOS App Store 特定注意事项部分 QA1795)。
当然,我们建议您测量自己的应用。为此,请参阅测量应用大小。
Flutter 如何定义像素?
Flutter 使用逻辑像素,通常将它们称为“像素”。Flutter 的devicePixelRatio
表示物理像素与逻辑 CSS 像素之间的比率。
功能
我可以期待什么样的应用性能?
您可以期待出色的性能。Flutter 旨在帮助开发者轻松实现恒定的 60fps。Flutter 应用使用本机编译代码运行,不涉及解释器。这意味着 Flutter 应用启动速度很快。
我可以期待什么样的开发者周期?编辑和刷新之间需要多长时间?
Flutter 实现了热重载开发者周期。您可以在设备或模拟器/仿真器上期待低于一秒的重载时间。
Flutter 的热重载是有状态的,因此在重载后会保留应用状态。这意味着您可以在应用中深度嵌套的屏幕上快速迭代,而无需在每次重载后从主屏幕开始。
热重载与热重启有何不同?
热重载通过将更新的源代码文件注入正在运行的 Dart VM(虚拟机)来工作。这不仅添加了新类,还向现有类添加了方法和字段,并更改了现有函数。热重启将状态重置为应用的初始状态。
有关更多信息,请参阅热重载。
我可以在哪里部署我的 Flutter 应用?
您可以编译并部署您的 Flutter 应用到 iOS、Android、Web 和桌面。
Flutter 可以在哪些设备和操作系统版本上运行?
-
我们支持和测试在各种低端到高端平台上运行 Flutter。有关我们进行测试的平台的详细列表,请参阅受支持平台列表。
-
Flutter 支持为
x86_64
、armeabi-v7a
和arm64-v8a
构建预先编译 (AOT) 的库。 -
为 ARMv7 或 ARM64 构建的应用在许多 x86 Android 设备上运行良好(使用 ARM 仿真)。
-
我们支持在各种平台上开发 Flutter 应用。请参阅每个 开发操作系统 下列出的系统要求。
Flutter 是否可以在网络上运行?
是的,稳定频道中提供了网络支持。有关更多详细信息,请查看 网络说明。
我可以用 Flutter 构建桌面应用吗?
是的,桌面支持在 Windows、macOS 和 Linux 上稳定运行。
我可以在现有的原生应用中使用 Flutter 吗?
是的,请在我们的网站的 add-to-app 部分了解更多信息。
我是否可以访问传感器和本地存储等平台服务和 API?
可以。Flutter 让开发者开箱即用地访问操作系统中的一些特定于平台的服务和 API。但是,我们希望避免大多数跨平台 API 中的“最低公分母”问题,因此我们不打算为所有原生服务和 API 构建跨平台 API。
许多平台服务和 API 在 pub.dev 上有 现成的软件包。使用现有软件包 很容易。
最后,我们鼓励开发者使用 Flutter 的异步消息传递系统来创建与 平台和第三方 API 的自己的集成。开发者可以公开尽可能多的平台 API,并构建最适合其项目的抽象层。
我是否可以扩展和自定义捆绑小部件?
当然可以。Flutter 的小部件系统设计为易于自定义。
Flutter 采用组合,而不是让每个小部件提供大量参数。小部件由较小的部件构建,你可以用新颖的方式重复使用和组合这些部件来制作自定义小部件。例如,ElevatedButton
组合了 Material 小部件和 GestureDetector
小部件,而不是对通用按钮小部件进行子类化。Material 小部件提供可视化设计,GestureDetector
小部件提供交互设计。
要创建具有自定义视觉设计的按钮,可以将实现视觉设计的微件与提供交互设计的 GestureDetector
结合使用。例如,CupertinoButton
遵循此方法,并将 GestureDetector
与实现其视觉设计的其他几个微件结合使用。
组合使您可以最大程度地控制微件的视觉和交互设计,同时还允许大量代码重用。在框架中,我们将复杂微件分解为分别实现视觉、交互和运动设计的各个部分。您可以根据自己的喜好重新组合这些微件,以制作具有完整表达范围的自定义微件。
为什么我想在 iOS 和 Android 之间共享布局代码?
您可以选择为 iOS 和 Android 实现不同的应用布局。开发人员可以自由地在运行时检查移动操作系统并呈现不同的布局,尽管我们发现这种做法很少见。
越来越多的移动应用布局和设计正在演变为更具品牌驱动性和跨平台统一性。这意味着在 iOS 和 Android 之间共享布局和 UI 代码的强烈动机。
该应用的美学设计的品牌标识和定制现在变得比严格遵循传统平台美学更为重要。例如,应用设计通常需要自定义字体、颜色、形状、运动等,以便清楚地传达其品牌标识。
我们还看到跨 iOS 和 Android 部署的常见布局模式。例如,“底部导航栏”模式现在可以在 iOS 和 Android 中自然找到。跨移动平台似乎存在设计思想的融合。
我是否可以与我的移动平台的默认编程语言进行互操作?
是的,Flutter 支持调用平台,包括与 Android 上的 Java 或 Kotlin 代码以及 iOS 上的 ObjectiveC 或 Swift 代码集成。这是通过灵活的消息传递样式实现的,其中 Flutter 应用可以使用 BasicMessageChannel
向移动平台发送和接收消息。
了解有关使用 平台通道 访问 Flutter 中的平台和第三方服务。
这是一个 示例项目,展示了如何使用平台通道访问 iOS 和 Android 上的电池状态信息。
Flutter 是否附带反射/镜像系统?
否。Dart 包含 dart:mirrors
,它提供类型反射。但由于 Flutter 应用已针对生产环境预编译,并且二进制大小始终是移动应用关注的问题,因此此库对 Flutter 应用不可用。
使用静态分析,我们可以剔除任何未使用的内容(“tree shaking”)。如果你导入一个庞大的 Dart 库,但只使用了一个独立的两行方法,那么你只需支付两行方法的成本,即使该 Dart 库本身导入了几十个其他库。只有当 Dart 可以在编译时识别代码路径时,此保证才安全。到目前为止,我们已经找到了针对特定需求的其他方法,这些方法提供了更好的权衡,例如代码生成。
如何在 Flutter 中进行国际化 (i18n)、本地化 (l10n) 和无障碍性 (a11y)?
在 国际化教程 中了解有关 i18n 和 l10n 的更多信息。
在 无障碍性文档 中了解有关 a11y 的更多信息。
如何为 Flutter 编写并行和/或并发应用?
Flutter 支持隔离。隔离是 Flutter 虚拟机中的独立堆,它们能够并行运行(通常实现为独立线程)。隔离通过发送和接收异步消息进行通信。
是否可以在 Flutter 应用的后台运行 Dart 代码?
是的,你可以在 iOS 和 Android 上的后台进程中运行 Dart 代码。有关更多信息,请参阅免费的 Medium 文章 使用 Flutter 插件和地理围栏在后台执行 Dart。
protobuffers(等等)?
是否可以在 Flutter 中使用 JSON/XML/当然可以。在 pub.dev 上有用于 JSON、XML、protobuf 以及许多其他实用程序和格式的库。
有关使用 JSON 与 Flutter 的详细说明,请查看 JSON 教程。
我可以用 Flutter 构建 3D(OpenGL)应用吗?
目前我们不支持使用 OpenGL ES 或类似技术构建 3D 应用。我们有长期计划公开一个经过优化的 3D API,但现在我们专注于 2D。
我的 APK 或 IPA 为什么这么大?
通常,包括图像、声音文件、字体等在内的资源构成了 APK 或 IPA 的大部分。Android 和 iOS 生态系统中的各种工具可以帮助你了解 APK 或 IPA 中的内容。
此外,务必使用 Flutter 工具创建 APK 或 IPA 的发行版。发行版通常远小于调试版。
了解有关创建 Android 应用发行版 和创建 iOS 应用发行版 的更多信息。此外,请查看 测量应用大小。
Flutter 应用可以在 Chromebook 上运行吗?
我们已经看到 Flutter 应用在某些 Chromebook 上运行。我们正在跟踪 与在 Chromebook 上运行 Flutter 相关的议题。
Flutter 是否兼容 ABI?
Flutter 和 Dart 不提供应用程序二进制接口 (ABI) 兼容性。提供 ABI 兼容性不是 Flutter 或 Dart 的当前目标。
框架
为什么 build() 方法在 State 上,而不是在 StatefulWidget 上?
在 State
上放置 Widget build(BuildContext context)
方法,而不是在 StatefulWidget
上放置 Widget build(BuildContext context, State state)
方法,在对 StatefulWidget
进行子类化时,为开发者提供了更大的灵活性。你可以阅读 有关 State.build
的 API 文档的更详细讨论。
Flutter 的标记语言在哪里?为什么 Flutter 没有标记语法?
Flutter UI 是使用命令式、面向对象语言(Dart,与用于构建 Flutter 框架的语言相同)构建的。Flutter 不附带声明性标记。
我们发现使用代码动态构建的 UI 允许更大的灵活性。例如,我们发现对于一个严格的标记系统来说,很难表达和生成具有定制行为的定制小组件。
我们还发现我们的“代码优先”方法更好地允许热重载和动态环境适应等功能。
可以创建一个自定义语言,然后将其动态转换为小组件。由于构建方法“只是代码”,因此它们可以执行任何操作,包括解释标记并将其转换为小组件。
我的应用在右上角有一个调试横幅/功能区。我为什么看到它?
默认情况下,flutter run
命令使用调试构建配置。
调试配置在 VM(虚拟机)中运行你的 Dart 代码,通过热重载实现快速开发周期(发行版构建使用标准Android和iOS工具链进行编译)。
调试配置还会检查所有断言,这有助于你在开发期间尽早发现错误,但会产生运行时成本。“调试”横幅表示已启用这些检查。你可以使用--profile
或--release
标志将flutter run
,在不进行这些检查的情况下运行你的应用。
如果你的 IDE 使用 Flutter 插件,则可以在概要文件或发行模式下启动应用。对于 VS Code,请使用运行 > 开始调试或运行 > 在不调试的情况下运行菜单项。对于 IntelliJ,请使用菜单项运行 > 在概要文件模式下运行 Flutter或发行模式。
Flutter 的框架使用什么编程范例?
Flutter 是一个多范例编程环境。过去几十年开发的许多编程技术都用在 Flutter 中。我们相信技术的优势使其特别适合,因此在每个技术中使用它。无特定顺序
- 合成
- Flutter 使用的主要范例是使用行为范围较窄的小对象,将它们组合在一起以获得更复杂的效果,有时称为激进组合。Flutter 小部件库中的大多数小部件都是以这种方式构建的。例如,Material
TextButton
类使用IconTheme
、InkWell
、Padding
、Center
、Material
、AnimatedDefaultTextStyle
和ConstrainedBox
构建。InkWell
使用GestureDetector
构建。Material
使用AnimatedDefaultTextStyle
、NotificationListener
和AnimatedPhysicalModel
构建。以此类推。一直都是小部件。 - 函数式编程
- 整个应用程序仅使用
StatelessWidget
构建,它们本质上是描述参数如何映射到其他函数的函数,最终以计算布局或绘制图形的基本函数为基础。(此类应用程序不容易具有状态,因此通常是非交互式的。)例如,Icon
小部件本质上是将参数(color
、icon
、size
)映射到布局基本函数的函数。此外,大量使用了不可变数据结构,包括整个Widget
类层次结构以及Rect
和TextStyle
等众多支持类。在较小范围内,Dart 的Iterable
API 大量使用了函数式风格(map、reduce、where 等),该 API 经常用于处理框架中的值列表。 - 事件驱动编程
- 用户交互由事件对象表示,这些事件对象分派给已使用事件处理程序注册的回调。屏幕更新由类似的回调机制触发。
Listenable
类用作动画系统的基础,它为具有多个侦听器的事件形式化了订阅模型。 - 基于类的面向对象编程
- 框架的大多数 API 都是使用具有继承关系的类构建的。我们使用一种方法,即在我们的基类中定义非常高级别的 API,然后在子类中迭代地对它们进行专门化。例如,我们的渲染对象有一个基类 (
RenderObject
),它与坐标系无关,然后我们有一个子类 (RenderBox
),它引入了几何形状应基于笛卡尔坐标系 (x/width 和 y/height) 的观点。 - 基于原型的面向对象编程
ScrollPhysics
类将实例链接起来,以在运行时动态地组合适用于滚动的物理特性。这使系统能够组合例如分页物理特性与特定于平台的物理特性,而无需在编译时选择平台。- 命令式编程
- 通常与封装在对象中的状态配对的直接命令式编程,用在它提供最直观解决方案的地方。例如,测试是以命令式风格编写的,首先描述测试中的情况,然后列出测试必须匹配的不变式,然后根据需要推进时钟或插入事件以进行测试。
- 响应式编程
- 小部件和元素树有时被描述为响应式的,因为在小部件的构造函数中提供的新的输入会立即通过小部件的构建方法作为对较低级别小部件的更改进行传播,并且在较低小部件中做出的更改(例如,响应于用户输入)使用事件处理程序沿树向上传播。框架中同时存在函数响应式和命令式响应式的方面,具体取决于小部件的需要。构建方法仅包含描述小部件如何对其配置中的更改做出反应的表达式的函数响应式小部件(例如,Material
Divider
类)。构建方法在多个语句中构建子项列表,描述小部件如何对其配置中的更改做出反应的命令式响应式小部件(例如,Chip
类)。 - 声明式编程
- 小部件的构建方法通常是具有多个嵌套构造函数级别的单个表达式,使用 Dart 的严格声明式子集编写。这样的嵌套表达式可以机械地转换到或从任何适当的表达标记语言。例如,
UserAccountsDrawerHeader
小部件有一个很长的构建方法(20 多行),由一个嵌套表达式组成。这也可以与命令式风格相结合,以构建在纯声明式方法中更难描述的用户界面。 - 泛型编程
- 类型可用于帮助开发者尽早发现编程错误。Flutter 框架使用泛型编程来提供这方面的帮助。例如,
State
类根据其关联小部件的类型进行参数化,以便 Dart 分析器可以发现状态和小部件的不匹配。类似地,GlobalKey
类采用类型参数,以便它可以以类型安全的方式(使用运行时检查)访问远程小部件的状态,Route
接口根据在弹出时预期使用的类型进行参数化,并且List
、Map
和Set
等集合全部进行参数化,以便可以在分析期间或调试期间在运行时尽早发现不匹配的元素。 - 并发编程
- Flutter 大量使用
Future
和其他异步 API。例如,动画系统通过完成 future 来报告动画何时完成。图像加载系统类似地使用 future 来报告何时完成加载。 - 约束编程
- Flutter 中的布局系统使用约束编程的弱形式来确定场景的几何形状。约束(例如,对于笛卡尔框,最小和最大宽度以及最小和最大高度)从父级传递到子级,并且子级选择一个满足这些约束的结果几何形状(例如,对于笛卡尔框,一个大小,具体来说是宽度和高度)。通过使用此技术,Flutter 通常可以使用单次传递来布局整个场景。
项目
在哪里可以获得支持?
如果您认为自己遇到了错误,请将其提交到我们的问题跟踪器中。您还可以使用Stack Overflow来解决“操作方法”类型的问题。如需讨论,请加入我们的邮件列表[email protected]或在Discord上找到我们。
更多信息,请参阅我们的社区页面。
如何参与?
Flutter 是开源的,我们鼓励您做出贡献。您可以通过在我们的问题跟踪器中提交功能请求和错误报告来开始。
我们建议您加入我们的邮件列表[email protected],并告诉我们您如何使用 Flutter 以及您希望如何使用它。
如果您有兴趣贡献代码,您可以首先阅读我们的贡献指南,并查看我们的简单入门问题列表。
最后,您可以与乐于助人的 Flutter 社区建立联系。更多信息,请参阅社区页面。
Flutter 是否是开源的?
是的,Flutter 是开源技术。您可以在GitHub上找到该项目。
哪些软件许可证适用于 Flutter 及其依赖项?
Flutter 包含两个组件:一个作为动态链接二进制文件提供的引擎,以及一个引擎加载的单独二进制文件 Dart 框架。该引擎使用具有许多依赖项的多个软件组件;在其许可证文件中查看完整列表。
该框架是完全自包含的,只需要一个许可证。
此外,您使用的任何 Dart 包可能都有自己的许可证要求。
如何确定我的 Flutter 应用程序需要展示哪些许可证?
有一个 API 可以找到您需要展示的许可证列表
-
如果您的应用程序具有
Drawer
,请添加AboutListTile
。 -
如果你的应用程序没有抽屉,但使用了 Material Components 库,请调用
showAboutDialog
或showLicensePage
。 -
对于更自定义的方法,你可以从
LicenseRegistry
获取原始许可证。
谁在从事 Flutter 工作?
我们所有人都在做!Flutter 是一个开源项目。目前,大部分开发工作是由 Google 的工程师完成的。如果你对 Flutter 感到兴奋,我们鼓励你加入社区并 为 Flutter 做出贡献!
Flutter 的指导原则是怎样的?
我们相信以下内容
- 为了覆盖所有潜在用户,开发人员需要针对多个移动平台。
- HTML 和 WebViews 以其当前形式,由于自动行为(滚动、布局)和传统支持,使得始终达到高帧速率和提供高保真体验变得具有挑战性。
- 如今,多次构建同一应用程序的成本太高:它需要不同的团队、不同的代码库、不同的工作流、不同的工具等。
- 开发人员希望找到一种更简单、更好的方法,使用单个代码库为多个目标平台构建移动应用程序,并且他们不想牺牲质量、控制或性能。
我们专注于三件事
- 控制
- 开发人员有权访问并控制系统的各个层。这将导致
- 性能
- 用户有权获得流畅、响应迅速、无卡顿的应用程序。这将导致
- 保真度:
- 每个人都应该获得精确、美观、令人愉悦的应用程序体验。
Apple 会拒绝我的 Flutter 应用程序吗?
我们无法代表 Apple 发言,但他们的 App Store 中包含许多使用 Flutter 等框架技术构建的应用程序。事实上,Flutter 使用与 Unity 相同的基本架构模型,Unity 是 Apple 商店中许多最流行的游戏的引擎。
Apple 经常推荐使用 Flutter 构建的优秀应用程序,包括 Hamilton 和 Reflectly。
与提交到 Apple 商店的任何应用程序一样,使用 Flutter 构建的应用程序应遵循 Apple 的 App Store 提交指南。