常见问题
介绍
#本页收集了一些关于 Flutter 的常见问题。您也可以查看以下专门的常见问题解答:
什么是 Flutter?
#Flutter 是 Google 的便携式 UI 工具包,用于从单一代码库构建精美的、原生编译的移动、Web 和桌面应用程序。Flutter 可与现有代码协同工作,被全球的开发人员和组织使用,并且是免费开源的。
Flutter 是为谁准备的?
#对于用户而言,Flutter 让精美的应用栩栩如生。
对于开发者而言,Flutter 降低了构建应用的门槛。它加速了应用开发,并降低了跨平台应用生产的成本和复杂性。
对于设计师而言,Flutter 为高端用户体验提供了画布。Fast Company 将 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 渲染引擎,对文本支持极佳
- 现代响应式框架
- 丰富的控件集,实现 Material Design 和 iOS 风格
- 单元测试和集成测试的 API
- 互操作和插件 API,用于连接系统和第三方 SDK
- 用于在 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 提供了一个现代响应式框架。Flutter 的框架设计为分层和可定制的(并且是可选的)。开发人员可以选择只使用框架的一部分,甚至完全替换框架的上层。
Flutter 自带控件(widgets)吗?
#是的!Flutter 提供了一套高质量的 Material Design 和 Cupertino(iOS 风格)控件、布局和主题。当然,这些控件只是一个起点。Flutter 的设计使得创建自己的控件或自定义现有控件变得容易。
Flutter 支持 Material Design 吗?
#是的!Flutter 和 Material 团队密切合作,完全支持 Material Design。有关更多信息,请查看控件目录中的 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)运行其代码,以实现有状态的热重载,此功能允许您在不重新编译的情况下对正在运行的代码进行更改。当在此模式下运行时,您会在应用右上方看到一个“Debug”横幅,以提醒您性能并非最终发布应用的典型表现。
Flutter 如何在 iOS 上运行我的代码?
#引擎的 C 和 C++ 代码使用 LLVM 编译。Dart 代码(SDK 的和您的)被预编译(AOT)成原生的 ARM 库。该库包含在一个“运行器”iOS 项目中,整个项目被构建成一个 .ipa
文件。启动时,应用会加载 Flutter 库。任何渲染、输入或事件处理等都委托给编译后的 Flutter 和应用代码。这与许多游戏引擎的工作方式类似。
在调试模式下,Flutter 使用虚拟机(VM)运行其代码,以实现有状态的热重载,此功能允许您在不重新编译的情况下对正在运行的代码进行更改。当在此模式下运行时,您会在应用右上方看到一个“Debug”横幅,以提醒您性能并非最终发布应用的典型表现。
Flutter 是否使用操作系统内置的原生控件?
#不。相反,Flutter 提供了一套控件(包括 Material Design 和 Cupertino(iOS 风格)控件),由 Flutter 的框架和引擎管理和渲染。您可以浏览 Flutter 控件的控件目录。
我们相信最终结果是更高质量的应用。如果我们重用内置的原生控件,Flutter 应用的质量和性能将受到这些控件的灵活性和质量的限制。
例如,在 Android 中,有一组硬编码的手势和固定规则来区分它们。在 Flutter 中,您可以编写自己的手势识别器,它将成为手势系统的一等参与者。此外,由不同人员编写的两个控件可以协同工作以区分手势。
现代应用设计趋势表明,设计师和用户希望 UI 更加丰富,并且以品牌为中心的设计。为了实现这种定制化、精美的设计水平,Flutter 的架构旨在驱动像素而不是内置控件。
通过使用相同的渲染器、框架和控件集,可以更容易地从同一个代码库为多个平台发布,而无需进行仔细且成本高昂的规划来对齐不同的功能集和 API 特性。
通过使用单一语言、单一框架和单一库集来编写所有代码(无论您的 UI 是否针对每个平台不同),我们还旨在帮助降低应用开发和维护成本。
当我的移动操作系统更新并引入新控件时会发生什么?
#Flutter 团队会关注 iOS 和 Android 新移动控件的采用和需求,并致力于与社区合作以支持新控件。这项工作可能以更低级别的框架功能、新的可组合控件或新的控件实现的形式出现。
Flutter 的分层架构旨在支持众多控件库,我们鼓励并支持社区构建和维护控件库。
当我的移动操作系统更新并引入新的平台功能时会发生什么?
#Flutter 的互操作性和插件系统旨在允许开发人员立即访问新的移动操作系统功能。开发人员无需等待 Flutter 团队公开新的移动操作系统功能。
Flutter 支持代码推送吗?
#Flutter 不直接支持代码推送(code push),即直接将应用更新推送到用户设备的能��。但是,我们知道一个第三方解决方案,称为Shorebird。请注意,这不是官方认可或推荐。
我可以使用哪些操作系统来构建 Flutter 应用?
#Flutter 支持使用 Linux、macOS、ChromeOS 和 Windows 进行开发。
Flutter 使用什么语言编写?
#Dart,一种快速发展的现代语言,针对客户端应用进行了优化。底层的图形框架和 Dart 虚拟机是用 C/C++ 实现的。
为什么 Flutter 选择使用 Dart?
#在初始开发阶段,Flutter 团队考察了许多语言和运行时,最终为框架和控件选择了 Dart。Flutter 使用四个主要维度进行评估,并考虑了框架作者、开发人员和最终用户的需求。我们发现许多语言满足部分要求,但 Dart 在所有评估维度上得分都很高,并满足我们的所有要求和标准。
Dart 运行时和编译器支持 Flutter 的两个关键功能的组合:基于 JIT 的快速开发周期,允许在有类型的语言中进行形状更改和有状态的热重载;以及一个 Ahead-of-Time 编译器,可生成高效的 ARM 代码,以实现快速启动和可预测的生产部署性能。
此外,我们有机会与 Dart 社区密切合作,该社区正在积极投入资源改进 Dart 以供 Flutter 使用。例如,当我们采用 Dart 时,该语言还没有用于生成原生二进制文件的 AOT 工具链,这对实现可预测的高性能至关重要,但现在该语言已具备,因为 Dart 团队为 Flutter 构建了它。同样,Dart VM 以前针对吞吐量进行了优化,但现在团队正在针对延迟进行优化,这对 Flutter 的工作负载更重要。
Dart 在以下主要标准上得分很高:
- 开发者生产力
- Flutter 的主要价值主张之一是它通过让开发人员用相同的代码库为 iOS 和 Android 创建应用来节省工程资源。使用一种高效的语言可以进一步加速开发人员的工作,并使 Flutter 更具吸引力。这对我们的框架团队和我们的开发人员来说都非常重要。Flutter 的大部分是用我们提供给用户的同一种语言构建的,因此我们需要保持 10 万行代码的生产力,而不会牺牲框架和控件对开发人员的可访问性或可读性。
- 面向对象
- 对于 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 Components,只有一个 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 构建的应用(使用 ARM 仿真)可以在许多 x86-64 Android 设备上正常运行。
我们支持在各种平台上开发 Flutter 应用。请参阅每个开发操作系统下的系统要求。
Flutter 能在 Web 上运行吗?
#是的,Web 支持在稳定版频道中可用。有关更多详细信息,请查看Web 指南。
我能使用 Flutter 构建桌面应用吗?
#是的,桌面支持已在 Windows、macOS 和 Linux 上稳定。
我能将 Flutter 集成到我现有的原生应用中吗?
#是的,请在网站的添加到应用部分了解更多信息。
我能访问传感器和本地存储等平台服务和 API 吗?
#是的。Flutter 为开发人员提供了开箱即用的对操作系统某些平台特定服务和 API 的访问。但是,我们希望避免大多数跨平台 API 的“最低公分母”问题,因此我们不打算为所有原生服务和 API 构建跨平台 API。
Pub.dev 上有许多平台服务和 API 的现成包。使用现有包非常简单。
最后,我们鼓励开发人员使用 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。Isolates 是 Flutter VM 中的独立堆,它们可以并行运行(通常实现为独立的线程)。Isolates 通过发送和接收异步消息进行通信。
我能在 Flutter 应用的后台运行 Dart 代码吗?
#是的,您可以在 iOS 和 Android 的后台进程中运行 Dart 代码。有关更多信息,请参阅免费的 Medium 文章“使用 Flutter 插件和地理围栏在后台执行 Dart”。
我能使用 JSON/XML/Protobufs(等等)与 Flutter 配合使用吗?
#绝对可以。在 pub.dev 上有适用于 JSON、XML、Protobufs 以及许多其他实用工具和格式的库。
有关使用 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 当前的目标。
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 允许更大的灵活性。例如,我们发现很难让一个僵化的标记系统来表达和生成具有定制行为的定制控件。
我们还发现,我们的“代码优先”方法更能支持热重载和动态环境适应等功能。
可以创建一个自定义语言,然后将其即时转换为控件。因为 build 方法“就是代码”,所以它们可以做任何事情,包括解释标记并将其转换为控件。
我的应用右上方有一个 Debug 标志/横幅。我为什么会看到它?
#默认情况下,flutter run
命令使用调试构建配置。
调试配置在 VM(虚拟机)中运行您的 Dart 代码,从而实现快速的开发周期和热重载(发布版本使用标准的Android和iOS工具链进行编译)。
调试配置还会检查所有断言,这有助于您在开发过程中及早发现错误,但会产生运行时成本。“Debug”横幅表示已启用这些检查。您可以使用 flutter run
的 --profile
或 --release
标志在没有这些检查的情况下运行您的应用。
如果您的 IDE 使用 Flutter 插件,您可以以配置文件模式或发布模式启动应用。对于 VS Code,请使用Run > Start debugging或Run > Run without debugging菜单项。对于 IntelliJ,请使用菜单项Run > Flutter Run in Profile Mode或Release Mode。
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
)映射到布局基元(Primitives)的函数。此外,还大量使用了不可变数据结构,包括整个Widget
类层次结构以及许多支持类,如Rect
和TextStyle
。在较小的规模上,Dart 的Iterable
API,它大量使用了函数式风格(map、reduce、where 等),经常用于在框架中处理值列表。 - 事件驱动编程
- 用户交互由事件对象表示,这些对象被分派到已注册事件处理程序的回调。屏幕更新由类似的回调机制触发。
Listenable
类,用作动画系统的基础,它将事件的订阅模型形式化,具有多个监听器。 - 类基础面向对象编程
- 框架的大部分 API 都是使用带有继承的类构建的。我们采用一种方法,即在我们基类中定义非常高层的 API,然后在子类中迭代地对其进行专门化。例如,我们的渲染对象有一个基类(
RenderObject
),该基类不关心坐标系,然后我们有一个子类(RenderBox
),该子类引入了几何形状应基于笛卡尔坐标系的观点(x/width 和 y/height)。 - 原型基础面向对象编程
ScrollPhysics
类在运行时动态地组合应用于滚动的物理特性,通过将实例链接在一起来实现。这允许系统在编译时无需选择平台即可组合例如分页物理特性和特定于平台的物理特性。- 命令式编程
- 通常与封装在对象中的状态配对的直接命令式编程,在它提供了最直观的解决方案时使用。例如,测试以命令式风格编写,首先描述被测试的情况,然后列出测试必须匹配的不变量,然后根据需要推进时钟或插入事件进行测试。
- 响应式编程
- 控件树和元素树有时被描述为响应式的,因为控件构造函数中提供的新输入会立即通过控件的构建方法传播为对底层控件的更改,并且底层控件中的更改(例如,响应用户输入)会通过事件处理程序传播回树。框架中同时存在函数式响应式和命令式响应式的方面,具体取决于控件的需求。构建方法仅由描述控件如何响应其配置更改的表达式组成的控件是函数式响应式控件(例如,Material
Divider
类)。构建方法由多个语句构成控件子项列表的控件,描述控件如何响应其配置更改,是命令式响应式控件(例如,Chip
类)。 - 声明式编程
- 控件的构建方法通常是带有多个嵌套构造函数级别的单个表达式,使用严格声明性的 Dart 子集编写。这种嵌套表达式可以机械地转换成或从任何足够富有表现力的标记语言转换。
- 例如,
UserAccountsDrawerHeader
控件有一个很长的构建方法(20+ 行),由一个单一的嵌套表达式组成。这也可以与命令式风格结合使用,以构建纯声明式方法难以描述的 UI。 - 泛型编程
- 并发编程
- Flutter 大量使用
Future
和其他异步 API。例如,动画系统通过完成 future 来报告动画何时完成。图像加载系统也类似地使用 future 来报告加载何时完成。 - 约束编程
- Flutter 中的布局系统使用一种弱形式的约束编程来确定场景的几何形状。约束(例如,对于笛卡尔框,最小和最大宽度以及最小和最大高度)从父级传递到子级,子级选择一个满足这些约束的几何形状(例如,对于笛卡尔框,一个大小,具体来说是宽度和高度)。通过使用这种技术,Flutter 通常可以在一次传递中布局整个场景。
项目
#我可以在哪里获得支持?
#如果您认为您遇到了一个 bug,请在我们的问题跟踪器中报告。您也可以使用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 和 WebViews 由于自动行为(滚动、布局)和对旧版本的支持,在保持高帧率和提供高保真体验方面存在挑战。
- 如今,重复构建同一个应用程序的成本太高:需要不同的团队、不同的代码库、不同的工作流程、不同的工具等。
- 开发人员希望有一种更简单、更好的方法来使用单一代码库为多个目标平台构建移动应用,并且他们不希望牺牲质量、控制或性能。
我们专注于三件事:
- 控制
- 开发人员应该能够访问并控制系统的所有层。这导致:
- 性能
- 用户应该获得完美流畅、响应迅速、无卡顿的应用。这导致:
- 保真度:
- 每个人都应该获得精确、精美、令人愉悦的应用体验。
Apple 会拒绝我的 Flutter 应用吗?
#我们无法代表 Apple 置评,但他们的 App Store 包含许多使用 Flutter 等框架技术构建的应用。事实上,Flutter 使用与 Unity 相同的基本架构模型,Unity 是为 Apple 商店中最流行的许多游戏提供动力的引擎。
Apple 经常推荐使用 Flutter 构建的优秀应用,包括Hamilton和Reflectly。
与提交到 Apple Store 的任何应用一样,使用 Flutter 构建的应用应遵循 Apple 的 App Store 提交指南。