常见问题
介绍
#本页面收集了关于 Flutter 的一些常见问题。您还可以查看以下专门的常见问题解答
什么是 Flutter?
#Flutter 是 Google 的便携式 UI 工具包,用于从单个代码库为移动、Web 和桌面平台构建精美、原生编译的应用。Flutter 可以与现有代码配合使用,被世界各地的开发者和组织广泛采用,并且是免费开源的。
Flutter 适用于哪些人群?
#对于用户而言,Flutter 让精美的应用栩栩如生。
对于开发者而言,Flutter 降低了应用开发的门槛。它加快了应用开发速度,并降低了跨平台应用生产的成本和复杂性。
对于设计师而言,Flutter 为高端用户体验提供了画布。《快公司》将 Flutter 描述为十年内最重要的设计理念之一,因为它能够将概念转化为生产代码,而无需受到传统框架的限制。它还可以作为一款高效的原型工具,提供拖放工具,例如FlutterFlow 以及基于 Web 的 IDE,例如Zapp!。
对于工程经理和企业而言,Flutter 允许将应用开发者整合为一个单一的移动、Web 和桌面应用团队,从单个代码库为多个平台构建品牌应用。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。
Firebase Studio 目前处于预览阶段,是一个由 AI 辅助的工作区,用于在云端进行全栈、多平台应用开发。Firebase Studio 支持 Dart 和 Flutter。欲了解更多信息,请查看Firebase Studio 入门。
或者,您可以使用终端中的 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-64 库。这些库包含在一个“运行器”Android 项目中,整个项目被构建成一个 .apk
文件。启动时,应用会加载 Flutter 库。任何渲染、输入或事件处理等都委托给编译后的 Flutter 和应用代码。这类似于许多游戏引擎的工作方式。
在调试模式下,Flutter 使用虚拟机 (VM) 来运行其代码,以实现有状态热重载,这是一项允许您在不重新编译的情况下更改正在运行的代码的功能。在此模式下运行时,您会在应用的右上角看到一个“调试”横幅,提醒您性能不代表最终发布的应用的性能。
Flutter 如何在 iOS 上运行我的代码?
#引擎的 C 和 C++ 代码使用 LLVM 编译。Dart 代码(包括 SDK 和您的代码)被提前编译 (AOT) 成原生的 ARM 库。该库包含在一个“运行器”iOS 项目中,整个项目被构建成一个 .ipa
文件。启动时,应用会加载 Flutter 库。任何渲染、输入或事件处理等都委托给编译后的 Flutter 和应用代码。这类似于许多游戏引擎的工作方式。
在调试模式下,Flutter 使用虚拟机 (VM) 来运行其代码,以实现有状态热重载,这是一项允许您在不重新编译的情况下更改正在运行的代码的功能。在此模式下运行时,您会在应用的右上角看到一个“调试”横幅,提醒您性能不代表最终发布的应用的性能。
Flutter 是否使用操作系统的内置平台组件?
#不是。相反,Flutter 提供了一套由 Flutter 框架和引擎管理和渲染的组件(包括 Material Design 和 Cupertino(iOS 风格)组件)。您可以浏览Flutter 组件目录。
我们相信最终结果是更高质量的应用。如果我们重用内置的平台组件,Flutter 应用的质量和性能将受到这些组件的灵活性和质量的限制。
例如,在 Android 中,有一套硬编码的手势和用于区分它们的固定规则。在 Flutter 中,您可以编写自己的手势识别器,它可以在手势系统中作为一流的参与者。此外,由不同人员编写的两个组件可以协调以区分手势。
现代应用设计趋势表明,设计师和用户希望拥有更丰富的动画 UI 和品牌优先的设计。为了实现这种高度定制的精美设计,Flutter 的架构旨在驱动像素而不是内置组件。
通过使用相同的渲染器、框架和组件集,可以更容易地从相同的代码库发布到多个平台,而无需进行耗时且昂贵的规划来对齐不同的功能集和 API 特性。
通过为所有代码(无论您的 UI 是否因平台而异)使用单一语言、单一框架和单一库集,我们还旨在帮助降低应用开发和维护成本。
当我的移动操作系统更新并引入新组件时会发生什么?
#Flutter 团队关注 iOS 和 Android 新移动组件的采用和需求,并致力于与社区合作,为新组件提供支持。这项工作可能以底层框架功能、新的可组合组件或新的组件实现的形式出现。
Flutter 的分层架构旨在支持众多组件库,我们鼓励并支持社区构建和维护组件库。
当我的移动操作系统更新并引入新的平台功能时会发生什么?
#Flutter 的互操作和插件系统旨在让开发者立即访问新的移动操作系统功能和能力。开发者无需等待 Flutter 团队公开新的移动操作系统功能。
Flutter 支持代码推送吗?
#代码推送,即直接向用户设备推送应用更新的能力,Flutter 并不直接支持。但是,我们知道有一个第三方解决方案,名为Shorebird。请注意,这并非官方认可或推荐。
我可以用哪些操作系统构建 Flutter 应用?
#Flutter 支持使用 Linux、macOS、ChromeOS 和 Windows 进行开发。
Flutter 是用什么语言编写的?
#Dart,一种快速发展的现代语言,针对客户端应用进行了优化。底层图形框架和 Dart 虚拟机是用 C/C++ 实现的。
为什么 Flutter 选择使用 Dart?
#在最初的开发阶段,Flutter 团队考察了许多语言和运行时,最终选择 Dart 作为框架和组件的语言。Flutter 使用了四个主要维度进行评估,并考虑了框架作者、开发者和最终用户的需求。我们发现许多语言符合某些要求,但 Dart 在我们所有的评估维度上都得分很高,并且满足了我们所有的要求和标准。
Dart 运行时和编译器支持 Flutter 的两个关键特性组合:一个基于 JIT 的快速开发周期,允许在带类型的语言中进行形状改变和有状态热重载;以及一个提前编译 (AOT) 编译器,可以生成高效的 ARM 代码,以实现生产部署的快速启动和可预测性能。
此外,我们还有机会与 Dart 社区紧密合作,他们正在积极投入资源改进 Dart 以供 Flutter 使用。例如,当我们采用 Dart 时,该语言还没有用于生成原生二进制文件的提前编译工具链,这对实现可预测的高性能至关重要,但现在该语言具备了,因为 Dart 团队为 Flutter 构建了它。同样,Dart VM 之前已针对吞吐量进行优化,但该团队现在正在优化 VM 以降低延迟,这对于 Flutter 的工作负载更为重要。
Dart 在以下主要标准上对我们来说得分很高:
- 开发者生产力
- Flutter 的主要价值主张之一是,它通过让开发者使用相同的代码库为 iOS 和 Android 创建应用来节省工程资源。使用一种高生产力的语言可以进一步加速开发者,并使 Flutter 更具吸引力。这对于我们的框架团队和开发者都非常重要。Flutter 的大部分都是用我们提供给用户的相同语言构建的,因此我们需要在数十万行代码的情况下保持高生产力,同时不牺牲框架和组件对开发者的可访问性或可读性。
- 面向对象
- 对于 Flutter,我们希望选择一种适合 Flutter 问题领域的语言:创建视觉用户体验。业界在面向对象语言中构建用户界面框架已有数十年的经验。虽然我们可以使用非面向对象的语言,但这将意味着重新发明轮子来解决几个难题。此外,绝大多数开发者都具有面向对象开发的经验,这使得学习如何使用 Flutter 进行开发变得更容易。
- 可预测的高性能
- 使用 Flutter,我们希望赋能开发者创建快速、流畅的用户体验。为了实现这一点,我们需要能够在每个动画帧期间运行大量的终端开发者代码。这意味着我们需要一种既能提供高性能又具有可预测性能的语言,而不会出现导致丢帧的周期性停顿。
- 快速分配
- Flutter 框架采用函数式风格流程,这严重依赖底层内存分配器高效处理小型、短生命周期的分配。这种风格是在具有此属性的语言中开发的,并且在缺乏此功能的语言中无法高效工作。
Flutter 可以运行任何 Dart 代码吗?
#Flutter 可以运行不直接或间接导入 dart:mirrors
或 dart:html
的 Dart 代码。
Flutter 可以将 Dart 编译成 JavaScript 吗?
#Flutter 使用js.dart
软件包将 Dart 编译为 JavaScript。
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 的QA1795 的iOS App Store 特定注意事项部分)。
当然,我们建议您测量自己的应用大小。为此,请参阅测量您的应用大小。
Flutter 如何定义像素?
#Flutter 使用逻辑像素,并且通常仅将它们称为“像素”。Flutter 的devicePixelRatio
表示物理像素和逻辑 CSS 像素之间的比率。
功能
#我可以期待什么样的应用性能?
#一般来说,您可以期待出色的性能。Flutter 旨在帮助开发者轻松实现稳定的 60fps。Flutter 应用使用原生编译代码运行,因此不涉及解释器。这意味着 Flutter 应用启动速度很快。
Flutter 在使用原生代码时的性能取决于您的应用架构。为了获得最佳性能,请熟悉 Flutter 的平台通道。这些通道提供了一个异步消息传递系统,用于与原生代码通信。
要了解更多关于性能和 Flutter 的信息,请参阅性能常见问题。
我可以期待什么样的开发周期?编辑和刷新之间需要多长时间?
#Flutter 实现了热重载开发周期。您可以在设备或模拟器上获得亚秒级的重载时间。
Flutter 的热重载是有状态的,因此在重载后会保留应用状态。这意味着您可以快速迭代应用中深层嵌套的屏幕,而无需在每次重载后都从主屏幕开始。
热重载与热重启有什么不同?
#热重载的工作原理是将更新的源代码文件注入正在运行的 Dart VM(虚拟机)。这不仅会添加新类,还会向现有类添加方法和字段,并更改现有函数。热重启将状态重置为应用的初始状态。
欲了解更多信息,请参阅热重载。
我可以在哪里部署我的 Flutter 应用?
#您可以将 Flutter 应用编译并部署到 iOS、Android、Web 和桌面。
Flutter 可以在哪些设备和操作系统版本上运行?
#我们支持并测试 Flutter 在各种低端到高端平台上的运行。有关我们测试平台的详细列表,请参阅支持的平台列表。
Flutter 支持为
x86-64
、armeabi-v7a
和arm64-v8a
构建提前编译 (AOT) 的库。为 ARMv7 或 ARM64 构建的应用在许多 x86-64 Android 设备上运行良好(使用 ARM 仿真)。
我们支持在多种平台上开发 Flutter 应用。请查看每个开发操作系统下所列的系统要求。
Flutter 可以在 Web 上运行吗?
#是的,Web 支持在稳定通道中可用。欲了解更多详细信息,请查看Web 指南。
我可以用 Flutter 构建桌面应用吗?
#是的,桌面支持在 Windows、macOS 和 Linux 上均已稳定。
我可以在我现有的原生应用中使用 Flutter 吗?
#是的,请在我们的网站添加到应用部分了解更多信息。
我能访问传感器和本地存储等平台服务和 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 上与 Swift 或 Objective-C 代码集成。这通过灵活的消息传递方式实现,Flutter 应用可以使用BasicMessageChannel
向移动平台发送和接收消息。
了解更多关于在 Flutter 中使用平台通道访问平台和第三方服务的信息。
这里有一个示例项目,展示了如何使用平台通道访问 iOS 和 Android 上的电池状态信息。
Flutter 自带反射/镜像系统吗?
#不是。Dart 包含 dart:mirrors
,它提供了类型反射。但由于 Flutter 应用是为生产环境预编译的,并且二进制大小始终是移动应用关注的问题,因此此库不适用于 Flutter 应用。
通过静态分析,我们可以删除任何未使用的内容(“摇树优化”)。如果您导入了一个巨大的 Dart 库,但只使用了一个独立的双行方法,那么您只需付出该双行方法的成本,即使该 Dart 库本身导入了数十个其他库。这种保证只有在 Dart 能够在编译时识别代码路径时才安全。到目前为止,我们已经为特定需求找到了其他方法,这些方法提供了更好的权衡,例如代码生成。
支持国际化和本地化吗?
#是的,Flutter 支持国际化 (i18n) 和本地化 (l10n),因此您的应用可以适应不同的语言和文化。您可以在国际化文档中了解更多信息。
支持哪些辅助功能?
#Flutter 支持严格的辅助功能要求 (a11y)。例如,屏幕阅读器、大文本、颜色对比度和硬件开关控制都得到了支持。要了解更多信息,请参阅辅助功能文档。
我如何为 Flutter 编写并行和/或并发应用?
#Flutter 支持隔离区 (isolates)。隔离区是 Flutter 虚拟机中独立的堆,它们能够并行运行(通常实现为独立的线程)。隔离区通过发送和接收异步消息进行通信。
查看一个Flutter 中使用隔离区的示例。
我可以在 Flutter 应用的后台运行 Dart 代码吗?
#是的,您可以在 iOS 和 Android 的后台进程中运行 Dart 代码。欲了解更多信息,请参阅免费的 Medium 文章使用 Flutter 插件和地理围栏在后台执行 Dart。
我可以在 Flutter 中使用 JSON/XML/Protobufs 等吗?
#当然可以。在pub.dev 上有用于 JSON、XML、protobufs 以及许多其他实用程序和格式的库。
有关在 Flutter 中使用 JSON 的详细说明,请查看JSON 教程。
我可以用 Flutter 构建 3D (OpenGL) 应用吗?
#目前我们不支持使用 OpenGL ES 或类似技术进行 3D。我们有长期计划来公开优化的 3D API,但目前我们专注于 2D。
为什么我的 APK 或 IPA 文件这么大?
#通常,图像、声音文件、字体等资源占据了 APK 或 IPA 的大部分空间。Android 和 iOS 生态系统中的各种工具可以帮助您了解 APK 或 IPA 的内部构成。
此外,请务必使用 Flutter 工具创建 APK 或 IPA 的发布版本。发布版本通常比调试版本小得多。
了解更多关于创建Android 应用的发布版本以及创建iOS 应用的发布版本的信息。另外,请查看测量您的应用大小。
Flutter 应用可以在 Chromebooks 上运行吗?
#我们已经看到 Flutter 应用在某些 Chromebook 上运行。我们正在跟踪与在 Chromebook 上运行 Flutter 相关的问题。
Flutter 兼容 ABI 吗?
#Flutter 和 Dart 不提供应用程序二进制接口 (ABI) 兼容性。提供 ABI 兼容性并非 Flutter 或 Dart 当前的目标。
Flutter 如何处理滚动?
#每个应用平台都使用了自定义滚动实现,以使滚动符合该平台的原生滚动外观和感觉。要了解更多关于 Flutter 滚动的信息,请参阅滚动文档。
框架
#为什么 build() 方法在 State 上,而不是 StatefulWidget 上?
#将 Widget build(BuildContext context)
方法放在 State
上而不是将 Widget build(BuildContext context, State state)
方法放在 StatefulWidget
上,在子类化 StatefulWidget
时为开发者提供了更大的灵活性。您可以在State.build
的 API 文档中阅读更详细的讨论。
Flutter 的标记语言在哪里?为什么 Flutter 没有标记语法?
#Flutter UI 是使用命令式、面向对象的语言(Dart,与构建 Flutter 框架所用的语言相同)构建的。Flutter 不自带声明式标记。
我们发现用代码动态构建 UI 能够提供更大的灵活性。例如,我们发现一个僵硬的标记系统很难表达和生成具有定制行为的自定义组件。
我们还发现,“代码优先”的方法更好地支持了热重载和动态环境适应等功能。
可以创建一种自定义语言,然后将其动态转换为组件。由于构建方法“只是代码”,它们可以做任何事情,包括解释标记并将其转换为组件。
我的应用右上方有一个调试横幅/色带。为什么我会看到它?
#默认情况下,flutter run
命令使用调试构建配置。
调试配置在 VM(虚拟机)中运行您的 Dart 代码,从而通过热重载实现快速开发周期(发布版本使用标准的Android 和iOS 工具链编译)。
调试配置还会检查所有断言,这有助于您在开发早期捕获错误,但会带来运行时开销。“Debug”横幅表示这些检查已启用。您可以使用 flutter run
命令的 --profile
或 --release
标志来运行您的应用,而无需进行这些检查。
如果您的 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 等)在框架中经常用于处理值列表。 - 事件驱动编程
- 用户交互由事件对象表示,这些事件对象被分派给在事件处理程序中注册的回调函数。屏幕更新由类似的回调机制触发。
Listenable
类,它被用作动画系统的基础,它将具有多个监听器的事件订阅模型形式化。 - 基于类的面向对象编程
- 框架的大多数 API 都是使用带有继承的类构建的。我们采用一种方法,即在基类中定义非常高级的 API,然后逐步在子类中进行专门化。例如,我们的渲染对象有一个基类(
RenderObject
)它与坐标系统无关,然后我们有一个子类(RenderBox
)它引入了几何图形应基于笛卡尔坐标系(x/宽度和 y/高度)的观点。 - 基于原型的面向对象编程
ScrollPhysics
类链接实例以在运行时动态组合适用于滚动的物理效果。这使得系统可以组合,例如,分页物理效果与平台特定物理效果,而无需在编译时选择平台。- 命令式编程
- 直接的命令式编程,通常与封装在对象中的状态配对,在提供最直观解决方案的地方使用。例如,测试以命令式风格编写,首先描述待测情况,然后列出测试必须匹配的不变式,然后根据测试需要推进时钟或插入事件。
- 响应式编程
- 组件和元素树有时被称为响应式的,因为组件构造函数中提供的新输入会立即通过组件的构建方法作为更改传播到较低级别的组件,而较低组件中进行的更改(例如,响应用户输入)则使用事件处理程序传播回树的上方。框架中同时存在函数式响应和命令式响应的方面,具体取决于组件的需求。构建方法仅包含一个表达式来描述组件如何响应其配置更改的组件是函数式响应组件(例如,Material 的
Divider
类)。构建方法通过多个语句构造子组件列表,描述组件如何响应其配置更改的组件是命令式响应组件(例如,Chip
类)。 - 声明式编程
- 组件的构建方法通常是一个具有多层嵌套构造函数的单个表达式,使用 Dart 的严格声明式子集编写。这种嵌套表达式可以机械地转换为任何合适的表达性标记语言,或从其中转换而来。例如,
UserAccountsDrawerHeader
组件有一个很长的构建方法(20 多行),由一个单独的嵌套表达式组成。这也可以与命令式风格结合使用,以构建纯声明式方法难以描述的 UI。 - 泛型编程
- 类型可以帮助开发者及早捕获编程错误。Flutter 框架使用泛型编程来提供帮助。例如,
State
类根据其关联组件的类型进行参数化,以便 Dart 分析器可以捕获状态和组件的不匹配。同样,GlobalKey
类接受一个类型参数,以便它可以以类型安全的方式(使用运行时检查)访问远程组件的状态,Route
接口使用它在弹出时预期使用的类型进行参数化,并且像List
、Map
和Set
这样的集合都经过参数化,以便在分析期间或调试期间的运行时及早捕获不匹配的元素。 - 并发编程
- Flutter 大量使用
Future
和其他异步 API。例如,动画系统通过完成一个 Future 来报告动画何时结束。图像加载系统也类似地使用 Future 来报告加载何时完成。 - 约束编程
- Flutter 中的布局系统使用一种弱形式的约束编程来确定场景的几何形状。约束(例如,对于笛卡尔盒子,最小和最大宽度以及最小和最大高度)从父级传递到子级,子级选择满足这些约束的最终几何形状(例如,对于笛卡尔盒子,大小,特别是宽度和高度)。通过使用这种技术,Flutter 通常可以在一次遍历中布局整个场景。
项目
#我可以在哪里获得支持?
#如果您认为您遇到了错误,请在我们的问题追踪器中提交。您也可以在Stack Overflow 上提出“如何操作”类型的问题。对于讨论,请加入我们的邮件列表flutter-dev@googlegroups.com 或在Discord 上找到我们。
欲了解更多信息,请参阅我们的社区页面。
我如何参与进来?
#Flutter 是开源的,我们鼓励您做出贡献。您可以从在我们的问题追踪器中提交功能请求和错误开始。
我们建议您加入我们的邮件列表flutter-dev@googlegroups.com,并告诉我们您如何使用 Flutter 以及您想用它做什么。
如果您对贡献代码感兴趣,可以从阅读我们的贡献指南开始,并查看我们的易于上手的问题列表。
最后,您可以与有用的 Flutter 社区建立联系。欲了解更多信息,请参阅社区页面。
您也可以在 Flutter 的Discord 上与其他开发者互动。
Flutter 是开源的吗?
#是的,Flutter 是开源技术。您可以在GitHub 上找到该项目。
哪些软件许可适用于 Flutter 及其依赖项?
#Flutter 包括两个组件:一个作为动态链接二进制文件发布的引擎,以及一个引擎加载的独立二进制文件 Dart 框架。该引擎使用多个具有许多依赖项的软件组件;请在其许可证文件中查看完整列表。
该框架完全独立,并且只需要一个许可证。
此外,您使用的任何 Dart 软件包可能都有自己的许可证要求。
我如何确定我的 Flutter 应用需要显示的许可证?
#有一个 API 可以找到您需要显示的许可证列表
如果您的应用有
Drawer
,请添加一个AboutListTile
。如果您的应用没有 Drawer 但使用了 Material Components 库,请调用
showAboutDialog
或showLicensePage
。对于更自定义的方法,您可以从
LicenseRegistry
获取原始许可证。
谁在开发 Flutter?
#我们都在参与!Flutter 是一个开源项目。目前,大部分开发工作由 Google 的工程师完成。如果您对 Flutter 充满热情,我们鼓励您加入社区并为 Flutter 做出贡献!
Flutter 的指导原则是什么?
#我们相信以下几点:
- 为了触达每一个潜在用户,开发者需要面向多个移动平台。
- 由于自动行为(滚动、布局)和遗留支持,现有的 HTML 和 WebView 难以持续实现高帧率并提供高保真体验。
- 如今,多次构建同一应用成本太高:它需要不同的团队、不同的代码库、不同的工作流程、不同的工具等。
- 开发者希望有一种更简单、更好的方法,使用单个代码库为多个目标平台构建移动应用,并且他们不希望牺牲质量、控制或性能。
我们专注于三件事:
- 控制
- 开发者理应能够访问和控制系统的所有层。这使得我们致力于实现
- 性能
- 用户理应获得流畅、响应迅速、无卡顿的应用体验。这使得我们致力于实现
- 保真度:
- 每个人都理应获得精确、美观、愉悦的应用体验。
Apple 会拒绝我的 Flutter 应用吗?
#我们不能代表 Apple 发言,但他们的 App Store 中包含许多使用 Flutter 等框架技术构建的应用。事实上,Flutter 使用与 Unity 相同的基本架构模型,而 Unity 是 Apple Store 中许多最受欢迎游戏背后的引擎。
Apple 经常推荐使用 Flutter 构建的优秀应用,其中包括Hamilton 和Reflectly。
与提交到 Apple Store 的任何应用一样,使用 Flutter 构建的应用应遵循 Apple 的指南进行 App Store 提交。