常见问题解答
- 简介
- Flutter 提供了什么?
- 技术
- 功能
- 我可以期待什么样的应用程序性能?
- 我可以期待什么样的开发者周期?编辑和刷新之间需要多长时间?{#hot-reload}
- _热重载 与 热重启_有何不同?
- 我可以在哪里部署我的Flutter应用程序?
- Flutter在哪些设备和操作系统版本上运行?
- Flutter是否在Web上运行?
- 我可以使用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工具包,用于从单个代码库创建用于移动、Web和桌面的精美、原生编译的应用程序。Flutter可与现有代码配合使用,被世界各地的开发人员和组织使用,并且是免费和开源的。
Flutter适合谁?
#对于用户来说,Flutter使美丽的应用程序栩栩如生。
对于开发人员来说,Flutter降低了构建应用程序的门槛。它加快了应用程序开发速度,降低了跨平台应用程序生产的成本和复杂性。
对于设计师来说,Flutter提供了一个高端用户体验的画布。《快公司》将Flutter描述为十年来最顶尖的设计理念之一,因为它能够将概念转化为生产代码,而不会像典型框架那样带来妥协。它还可以作为一种高效的原型设计工具,可以使用FlutterFlow等拖放工具和Zapp!等基于Web的IDE。
对于工程经理和企业来说,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风格的丰富的widget集
- 用于单元测试和集成测试的API
- 与系统和第三方SDK连接的互操作和插件API
- 用于在Windows、Linux和Mac上运行测试的headless测试运行器
- Flutter DevTools(也称为Dart DevTools),用于测试、调试和分析您的应用程序
- 用于创建、构建、测试和编译应用程序的命令行工具
Flutter是否与任何编辑器或IDE配合使用?
#我们为VS Code、Android Studio和IntelliJ IDEA提供了插件。有关设置详细信息,请参阅编辑器配置,有关如何使用插件的提示,请参阅VS Code和Android Studio/IntelliJ。
当前处于测试阶段的Project IDX是用于云端全栈、多平台应用程序开发的AI辅助工作区。IDX支持Dart和Flutter。有关更多信息,请查看Project IDX入门指南。
或者,您可以从终端使用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上运行我的代码?{#run-android}
#引擎的C和C++代码是用Android的NDK编译的。Dart代码(SDK的和你的)都是提前(AOT)编译成原生、ARM和x86-64库。这些库包含在一个“runner”Android项目中,整个项目都构建成一个.apk
文件。启动时,应用程序加载Flutter库。任何渲染、输入或事件处理等等都委托给已编译的Flutter和应用程序代码。这类似于许多游戏引擎的工作方式。
在调试模式下,Flutter使用虚拟机(VM)来运行其代码,以便启用有状态热重载,这是一个允许您在不重新编译的情况下更改正在运行的代码的功能。在此模式下运行时,您会在应用程序的右上角看到一个“调试”横幅,以提醒您性能并非最终发布应用程序的特征。
Flutter如何在iOS上运行我的代码?{#run-ios}
#引擎的C和C++代码是用LLVM编译的。Dart代码(SDK的和你的)都是提前(AOT)编译成原生ARM库。该库包含在一个“runner”iOS项目中,整个项目都构建成一个.ipa
文件。启动时,应用程序加载Flutter库。任何渲染、输入或事件处理等等都委托给已编译的Flutter和应用程序代码。这类似于许多游戏引擎的工作方式。
在调试模式下,Flutter使用虚拟机(VM)来运行其代码,以便启用有状态热重载,这是一个允许您在不重新编译的情况下更改正在运行的代码的功能。在此模式下运行时,您会在应用程序的右上角看到一个“调试”横幅,以提醒您性能并非最终发布应用程序的特征。
Flutter是否使用我的操作系统的内置平台小部件?
#不。相反,Flutter提供了一组小部件 (包括Material Design和Cupertino(iOS风格)小部件),由Flutter的框架和引擎管理和渲染。您可以浏览Flutter小部件目录。
我们相信最终结果是更高质量的应用程序。如果我们重用内置的平台小部件,Flutter应用程序的质量和性能将受到这些小部件的灵活性和质量的限制。
例如,在Android中,有一组硬编码的手势和用于消除歧义的固定规则。在Flutter中,您可以编写自己的手势识别器,它是手势系统中的一等参与者。此外,由不同人员创作的两个小部件可以协调以消除手势歧义。
现代应用程序设计趋势表明,设计师和用户希望拥有更多运动丰富的UI和品牌优先的设计。为了实现这种定制的精美设计,Flutter的架构是驱动像素而不是内置小部件。
通过使用相同的渲染器、框架和小部件集,可以更容易地从相同的代码库发布到多个平台,而无需进行仔细且昂贵的规划来调整不同的功能集和API特性。
通过对所有代码使用单一语言、单一框架和单一库集(无论您的UI在每个平台上是否不同),我们还旨在帮助降低应用程序的开发和维护成本。
当我的移动操作系统更新并引入新的Widget时会发生什么?
#Flutter团队会关注iOS和Android对新移动小部件的采用和需求,并致力于与社区合作构建对新小部件的支持。这项工作可能以较低级别的框架功能、新的可组合小部件或新的Widget实现的形式出现。
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的快速开发周期,允许在具有类型的语言中进行形状更改和有状态热重载;以及一个提前编译器,它为快速启动和生产部署的可预测性能发出高效的ARM代码。
此外,我们有机会与Dart社区紧密合作,该社区正在积极投资资源以改进Dart在Flutter中的使用。例如,当我们采用Dart时,该语言还没有用于生成原生二进制文件的提前工具链,这对于实现可预测的高性能至关重要,但是现在该语言有了,因为Dart团队为Flutter构建了它。类似地,Dart VM以前针对吞吐量进行了优化,但该团队现在正在针对延迟优化VM,这对于Flutter的工作负载更为重要。
Dart在以下主要标准中获得了很高的分数:
开发人员生产力 :Flutter的主要价值主张之一是,它通过让开发人员使用相同的代码库为iOS和Android创建应用程序来节省工程资源。使用高生产力的语言可以进一步加快开发人员的速度,并使Flutter更具吸引力。这对我们的框架团队和开发人员都非常重要。大部分Flutter都是用我们提供给用户的同一种语言构建的,因此我们需要在10万行代码中保持生产力,而不会牺牲框架和小部件对于我们开发人员的易用性或可读性。
面向对象 :对于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的QA1795部分的iOS App Store特定注意事项部分)。
当然,我们建议您测量您自己的应用程序。为此,请参阅测量应用程序大小。
Flutter如何定义像素?
#Flutter使用逻辑像素,通常只将其称为“像素”。Flutter的devicePixelRatio
表示物理像素和逻辑CSS像素之间的比率。
功能
#我可以期待什么样的应用程序性能?
#您可以期待出色的性能。Flutter旨在帮助开发人员轻松实现恒定的60fps。Flutter应用程序使用原生编译的代码运行——不涉及解释器。这意味着Flutter应用程序启动速度很快。
我可以期待什么样的开发者周期?编辑和刷新之间需要多长时间?{#hot-reload}
#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应用程序无法使用此库。
使用静态分析,我们可以删除任何未使用的代码(“tree shaking”)。如果您导入了一个巨大的Dart库,但是只使用了一个独立的两行方法,那么您只需支付两行方法的成本,即使该Dart库本身导入了数十个其他库。只有当Dart能够在编译时识别代码路径时,此保证才是安全的。到目前为止,我们已经找到了针对特定需求的其他方法,这些方法提供了更好的权衡,例如代码生成。
我如何在Flutter中进行国际化(i18n)、本地化(l10n)和辅助功能(a11y)?
#在国际化教程中了解有关i18n和l10n的更多信息。
在辅助功能文档中了解有关a11y的更多信息。
我如何为Flutter编写并行和/或并发应用程序?
#Flutter支持隔离。隔离是Flutter VM中的单独堆,它们能够并行运行(通常实现为单独的线程)。隔离通过发送和接收异步消息进行通信。
我可以在Flutter应用程序的后台运行Dart代码吗?
#是的,您可以在iOS和Android上在后台进程中运行Dart代码。有关更多信息,请参阅免费的Medium文章使用Flutter插件和地理围栏在后台执行Dart。
我可以在Flutter中使用JSON/XML/protobuffers(等等)吗?
#绝对可以。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应用程序是否在Chromebook上运行?
#我们已经看到Flutter应用程序在某些Chromebook上运行。我们正在跟踪与在Chromebook上运行Flutter相关的問題。
Flutter是否与ABI兼容?
#Flutter和Dart不提供应用程序二进制接口(ABI)兼容性。提供ABI兼容性不是Flutter或Dart的当前目标。
框架
#为什么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工具链进行编译)。
调试配置还会检查所有断言,这有助于您在开发过程中尽早发现错误,但会带来运行时成本。“调试”横幅表示已启用这些检查。您可以使用--profile
或--release
标志运行flutter run
来运行您的应用程序而无需进行这些检查。
如果您的IDE使用Flutter插件,您可以以配置文件或发布模式启动应用程序。对于VS Code,请使用运行>启动调试 或 运行>无调试运行菜单项。对于IntelliJ,请使用菜单项运行>在配置文件模式下运行Flutter 或 发布模式。
Flutter的框架使用什么编程范式?
#Flutter是一个多范式编程环境。Flutter使用了在过去几十年中开发的许多编程技术。我们在我们相信技术的优势使其特别适合的地方使用每一个技术。按任意顺序:
组合 :Flutter使用的一种主要范式是使用具有狭窄行为范围的小对象,将它们组合在一起以获得更复杂的效果,有时称为 积极组合 。Flutter小部件库中的大多数小部件都是以这种方式构建的。例如,MaterialTextButton
类是使用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/width和y/height)。
原型基于的面向对象编程 :ScrollPhysics
类链接实例以组合在运行时动态应用于滚动的物理特性。这允许系统组合,例如,分页物理特性和特定于平台的物理特性,而无需在编译时选择平台。
命令式编程 :在命令式编程提供最直观解决方案的地方,通常会将其与封装在对象中的状态配对使用。例如,测试是用命令式风格编写的,首先描述被测试的情况,然后列出测试必须匹配的不变式,然后根据需要推进时钟或插入事件以进行测试。
响应式编程 :小部件和元素树有时被描述为响应式的,因为在小部件的构造函数中提供的新输入会立即通过小部件的build方法作为更改传播到较低级别的小部件,并且在较低级别的小部件中进行的更改(例如,响应用户输入)会使用事件处理程序向上传播到树中。框架中同时存在函数式响应式和命令式响应式,具体取决于小部件的需求。具有build方法的小部件,该方法仅包含一个表达式,用于描述小部件如何对配置更改做出反应,是函数式响应式小部件(例如,Material Divider
类)。其build方法在多个语句中构造子列表的小部件,描述了小部件如何对配置更改做出反应,是命令式响应式小部件(例如,Chip
类)。
声明式编程 :小部件的build方法通常是具有多层嵌套构造函数的单个表达式,使用Dart的严格声明式子集编写。这样的嵌套表达式可以机械地转换为或从任何合适的表达标记语言转换。例如,UserAccountsDrawerHeader
小部件有一个很长的build方法(20多行),它由一个嵌套表达式组成。这也可以与命令式风格结合使用,以构建在纯声明式方法中难以描述的UI。
泛型编程 :可以使用类型来帮助开发人员尽早发现编程错误。Flutter框架使用泛型编程来帮助实现这一点。例如,State
类根据其关联小部件的类型进行参数化,以便Dart分析器可以捕获状态和小部件的不匹配。类似地,GlobalKey
类采用类型参数,以便它能够以类型安全的方式访问远程小部件的状态(使用运行时检查),Route
接口使用它在弹出时预期使用的类型进行参数化,以及诸如List
、Map
和Set
之类的集合都被参数化,以便可以在分析期间或调试期间的运行时尽早捕获不匹配的元素。
并发编程 :Flutter大量使用了Future
和其他异步API。例如,动画系统通过完成一个future来报告动画何时完成。图像加载系统同样使用future来报告加载何时完成。
约束编程 :Flutter中的布局系统使用约束编程的弱形式来确定场景的几何形状。约束(例如,对于笛卡尔框,最小和最大宽度以及最小和最大高度)从父级传递到子级,子级选择满足这些约束的结果几何形状(例如,对于笛卡尔框,大小,特别是宽度和高度)。通过使用这种技术,Flutter通常可以使用单次传递来布置整个场景。
项目
#我在哪里可以获得支持?
#如果您认为遇到错误,请在我们的问题跟踪器中提交。您还可以使用Stack Overflow来解决“HOWTO”类型的问题。如需讨论,请加入我们的邮件列表[email protected]或在Discord上查找我们。
有关更多信息,请参阅我们的社区页面。
如何参与?
#Flutter是开源的,我们鼓励您贡献。您可以从为我们的问题跟踪器中的功能请求和错误提交问题开始。
我们建议您加入我们的邮件列表[email protected],并让我们知道您如何使用Flutter以及您想用它做什么。
如果您有兴趣贡献代码,您可以从阅读我们的贡献指南开始,并查看我们的简单的入门问题列表。
最后,您可以与有帮助的Flutter社区联系。有关更多信息,请参阅社区页面。
您还可以与FlutterDiscord上的其他开发人员互动。
Flutter是开源的吗?
#是的,Flutter是开源技术。您可以在GitHub上找到该项目。
Flutter及其依赖项适用哪些软件许可证?
#Flutter包含两个组件:一个作为动态链接二进制文件提供的引擎,以及引擎加载的作为单独二进制文件的Dart框架。引擎使用多个软件组件以及许多依赖项;请在其许可证文件中查看完整列表。
该框架是完全独立的,只需要一个许可证。
此外,您使用的任何Dart软件包都可能有其自身的许可证要求。
如何确定我的Flutter应用程序需要显示哪些许可证?
#有一个API可以查找您需要显示的许可证列表:
如果您的应用程序具有
Drawer
,请添加一个AboutListTile
。如果您的应用程序没有抽屉但使用了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应用程序。
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。