跳至主要内容
内容

常见问题解答

内容

简介

#

此页面收集了一些关于 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 浏览器技术或每个设备附带的 Widget 集。相反,Flutter 使用自己的高性能渲染引擎来绘制 Widget。

此外,Flutter 与众不同,因为它只有一层薄薄的 C/C++ 代码。Flutter 使用Dart(一种现代、简洁、面向对象的语言)实现了其大部分系统(合成、手势、动画、框架、Widget 等),开发人员可以轻松地访问、读取、更改、替换或删除它。这使开发人员能够对系统进行极大的控制,并大大降低了大多数系统可访问性的门槛。

我应该使用 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 风格框架
  • 丰富的 Widget 集,实现了 Material Design 和 iOS 风格
  • 用于单元测试和集成测试的 API
  • 与系统和第三方 SDK 连接的互操作和插件 API
  • 无头测试运行器,用于在 Windows、Linux 和 Mac 上运行测试
  • Flutter DevTools(也称为 Dart DevTools)用于测试、调试和分析您的应用程序
  • 用于创建、构建、测试和编译应用程序的命令行工具

Flutter 是否适用于任何编辑器或 IDE?

#

我们为VS CodeAndroid StudioIntelliJ IDEA 提供插件。有关设置详细信息,请参阅编辑器配置,有关如何使用插件的提示,请参阅VS CodeAndroid Studio/IntelliJ

Project IDX 目前处于测试阶段,是一个基于云的 AI 辅助工作区,用于全栈、跨平台应用程序开发。IDX 支持 Dart 和 Flutter。有关更多信息,请查看Project IDX 入门指南。

或者,您可以从终端使用flutter命令,以及许多支持编辑 Dart的编辑器之一。

Flutter 是否自带框架?

#

是的!Flutter 自带了一个现代的 React 风格框架。Flutter 的框架旨在分层和可自定义(并且是可选的)。开发人员可以选择仅使用框架的部分功能,甚至完全替换框架的上层。

Flutter 是否自带 Widget?

#

是的!Flutter 自带了一组高质量的 Material Design 和 Cupertino(iOS 风格)Widget、布局和主题。当然,这些 Widget 仅仅是一个起点。Flutter 旨在让您轻松创建自己的 Widget 或自定义现有 Widget。

Flutter 是否支持 Material Design?

#

是的!Flutter 和 Material 团队密切合作,并且完全支持 Material。有关更多信息,请查看Widget 目录中的 Material 2 和 Material 3 Widget。

Flutter 是否自带测试框架?

#

是的,Flutter 提供了用于编写单元测试和集成测试的 API。详细了解使用 Flutter 进行测试

我们使用自己的测试功能来测试我们的 SDK,并在每次提交时测量我们的测试覆盖率

Flutter 是否自带调试工具?

#

是的,Flutter 自带Flutter DevTools(也称为 Dart DevTools)。有关更多信息,请参阅使用 Flutter 进行调试Flutter DevTools文档。

Flutter 是否自带依赖注入框架?

#

我们没有提供意见化的解决方案,但是有一些软件包提供了依赖注入和服务定位,例如injectableget_itkiwiriverpod

技术

#

Flutter 使用什么技术构建?

#

Flutter 使用 C、C++、Dart、Skia(一个 2D 渲染引擎)和Impeller(iOS 上的默认渲染引擎)构建。查看此架构图,以更好地了解主要组件。有关 Flutter 分层架构的更详细描述,请阅读架构概述

Flutter 如何在我的 Android 代码上运行?

#

引擎的 C 和 C++ 代码使用 Android 的 NDK 编译。Dart 代码(SDK 和您自己的代码)都进行了提前 (AOT) 编译,生成原生 ARM 和 x86-64 库。这些库包含在一个“runner” Android 项目中,整个项目构建成一个 .apk 文件。启动时,应用加载 Flutter 库。任何渲染、输入或事件处理等操作都委托给已编译的 Flutter 和应用代码。这与许多游戏引擎的工作方式类似。

在调试模式下,Flutter 使用虚拟机 (VM) 来运行其代码,以便启用有状态热重载功能,此功能允许您在不重新编译的情况下更改正在运行的代码。在使用此模式运行时,您会在应用的右上角看到一个“调试”横幅,以提醒您性能不代表最终发布应用的性能特征。

Flutter 如何在我的 iOS 代码上运行?

#

引擎的 C 和 C++ 代码使用 LLVM 编译。Dart 代码(SDK 和您自己的代码)都进行了提前 (AOT) 编译,生成一个原生 ARM 库。该库包含在一个“runner” iOS 项目中,整个项目构建成一个 .ipa 文件。启动时,应用加载 Flutter 库。任何渲染、输入或事件处理等操作都委托给已编译的 Flutter 和应用代码。这与许多游戏引擎的工作方式类似。

在调试模式下,Flutter 使用虚拟机 (VM) 来运行其代码,以便启用有状态热重载功能,此功能允许您在不重新编译的情况下更改正在运行的代码。在使用此模式运行时,您会在应用的右上角看到一个“调试”横幅,以提醒您性能不代表最终发布应用的性能特征。

Flutter 是否使用我的操作系统的内置平台 Widget?

#

不是。相反,Flutter 提供了一组小部件(包括 Material Design 和 Cupertino(iOS 风格)小部件),由 Flutter 的框架和引擎管理和渲染。您可以浏览 Flutter 小部件目录

我们相信最终结果是更高质量的应用。如果我们重用内置平台小部件,Flutter 应用的质量和性能将受到这些小部件的灵活性和质量的限制。

例如,在 Android 中,有一组硬编码的手势和用于区分这些手势的固定规则。在 Flutter 中,您可以编写自己的手势识别器,它是 手势系统 中的一等公民。此外,由不同人员编写的两个小部件可以协调以区分手势。

现代应用设计趋势表明,设计师和用户希望获得更多运动丰富的 UI 和以品牌为中心的界面设计。为了实现这种定制化、美观的设计,Flutter 被设计为驱动像素,而不是内置小部件。

通过使用相同的渲染器、框架和小部件集,可以更轻松地从相同的代码库发布到多个平台,而无需进行谨慎且昂贵的规划以对齐不同的功能集和 API 特性。

通过对所有代码使用单一语言、单一框架和单一库集(无论您的 UI 是否因平台而异),我们还旨在帮助降低应用开发和维护成本。

当我的移动操作系统更新并引入新的 Widget 时会发生什么?

#

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 的快速开发周期,允许在具有类型的语言中进行形状更改和有状态热重载,以及提前编译器,它发出高效的 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:mirrorsdart:html 的 Dart 代码。

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 的热重载是有状态的,因此应用状态在重载后会保留。这意味着您可以快速迭代应用中嵌套很深的屏幕,而无需在每次重载后都从主屏幕开始。

热重载热重启有何不同?

#

热重载通过将更新的源代码文件注入正在运行的 Dart VM(虚拟机)来工作。这不仅添加了新类,还向现有类添加了方法和字段,并更改了现有函数。热重启将状态重置为应用的初始状态。

有关更多信息,请参阅 热重载

我可以在哪里部署我的 Flutter 应用程序?

#

您可以将 Flutter 应用编译并部署到 iOS、Android、Web桌面

Flutter 在哪些设备和操作系统版本上运行?

#
  • 我们支持并在各种低端到高端平台上测试运行 Flutter。有关我们测试平台的详细列表,请参阅支持的平台列表。

  • Flutter 支持为x86-64armeabi-v7aarm64-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 的全部或部分内容,并构建最适合其项目的抽象层。

我可以扩展和自定义捆绑的 Widget 吗?

#

绝对可以。Flutter 的 Widget 系统旨在易于自定义。

Flutter 采用组合的方式,而不是让每个 Widget 提供大量参数。Widget 由更小的 Widget 构建而成,您可以以新颖的方式重复使用和组合这些更小的 Widget 来创建自定义 Widget。例如,而不是对通用按钮 Widget(ElevatedButton)进行子类化,它将 Material Widget 与 GestureDetector Widget 组合在一起。Material Widget 提供视觉设计,而 GestureDetector Widget 提供交互设计。

要创建具有自定义视觉设计的按钮,您可以将实现视觉设计的 Widget 与 GestureDetector 组合,后者提供交互设计。例如,CupertinoButton 遵循此方法,并将 GestureDetector 与实现其视觉设计的其他几个 Widget 组合在一起。

组合使您可以最大程度地控制 Widget 的视觉和交互设计,同时也允许大量代码重用。在框架中,我们将复杂的 Widget 分解成分别实现视觉、交互和运动设计的部件。您可以根据需要随意混合这些 Widget,以创建具有完整表达范围的自定义 Widget。

为什么我想跨 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 使用隔离区的示例

我可以在 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 相关的 issue

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 允许更大的灵活性。例如,我们发现刚性的标记系统难以表达和生成具有定制行为的自定义 Widget。

我们还发现,我们的“代码优先”方法更好地支持了热重载和动态环境自适应等功能。

可以创建一个自定义语言,然后将其动态转换为 Widget。因为构建方法“仅仅是代码”,所以它们可以执行任何操作,包括解释标记并将其转换为 Widget。

我的应用程序在右上角有一个调试横幅/功能区。为什么我看到了它?

#

默认情况下,flutter run 命令使用调试构建配置。

调试配置在 VM(虚拟机)中运行您的 Dart 代码,从而使用热重载实现快速的开发周期(发布版本使用标准AndroidiOS工具链进行编译)。

调试配置还会检查所有断言,这有助于您在开发的早期阶段捕获错误,但会带来运行时成本。“调试”横幅指示这些检查已启用。您可以使用 --profile--release 标志运行 flutter run 来运行应用,而无需这些检查。

如果您的 IDE 使用 Flutter 插件,则可以在配置文件或发布模式下启动应用。对于 VS Code,请使用运行 > 开始调试运行 > 无调试运行菜单项。对于 IntelliJ,请使用菜单项运行 > 以配置文件模式运行 Flutter发布模式

Flutter 的框架使用哪种编程范式?

#

Flutter 是一个多范式编程环境。Flutter 中使用了过去几十年中开发的许多编程技术。我们在我们认为技术的优势使其特别适合的地方使用每一种技术。无特定顺序

组合
Flutter 使用的主要范式是使用具有狭窄行为范围的小对象,将它们组合在一起以获得更复杂的效果,有时称为积极组合。Flutter Widget 库中的大多数 Widget 都是以这种方式构建的。例如,Material TextButton 类是使用 IconThemeInkWellPaddingCenterMaterialAnimatedDefaultTextStyleConstrainedBox 构建的。InkWell 是使用 GestureDetector 构建的。Material 是使用 AnimatedDefaultTextStyleNotificationListenerAnimatedPhysicalModel 构建的。等等。一直都是 Widget。
函数式编程
整个应用都可以仅使用StatelessWidget构建,它本质上是描述参数如何映射到其他函数的函数,最终会降低到计算布局或绘制图形的基元。(此类应用不容易拥有状态,因此通常是非交互式的。)例如,Icon Widget 本质上是一个函数,它将它的参数(coloriconsize)映射到布局基元。此外,大量使用了不可变的数据结构,包括整个Widget类层次结构以及许多支持类,如RectTextStyle。在较小的范围内,Dart 的Iterable API(大量使用函数式风格(map、reduce、where 等))经常用于处理框架中的值列表。
事件驱动编程

用户交互由事件对象表示,这些事件对象被分发到已注册到事件处理程序的回调函数中。屏幕更新由类似的回调机制触发。 Listenable 类作为动画系统的基础,将事件的多监听器订阅模型形式化。
基于类的面向对象编程
框架的大多数 API 都是使用具有继承关系的类构建的。我们使用一种方法,在基类中定义非常高级别的 API,然后在子类中迭代地对其进行专门化。例如,我们的渲染对象有一个基类 (RenderObject),它与坐标系无关,然后我们有一个子类 (RenderBox) 引入了几何图形应基于笛卡尔坐标系(x/width 和 y/height)的观点。
基于原型的面向对象编程
ScrollPhysics 类链接实例以组合在运行时动态应用于滚动的物理特性。这使得系统能够组合,例如,分页物理特性和特定于平台的物理特性,而无需在编译时选择平台。
命令式编程
在提供最直观解决方案的地方,使用简单的命令式编程,通常与封装在对象中的状态配对。例如,测试以命令式风格编写,首先描述测试中的情况,然后列出测试必须匹配的不变式,然后根据需要推进时钟或插入事件以进行测试。
响应式编程
小部件和元素树有时被描述为响应式的,因为在小部件的构造函数中提供的新输入会立即通过小部件的构建方法作为更改传播到较低级别的小部件,并且在较低级别的小部件中进行的更改(例如,响应用户输入)使用事件处理程序向上传播到树中。框架中同时存在函数式反应式和命令式反应式,具体取决于小部件的需求。构建方法仅包含描述小部件如何对其配置更改做出反应的表达式的部件是函数式反应式部件(例如,Material Divider 类)。构建方法在多个语句上构造子列表的部件,描述小部件如何对其配置更改做出反应,是命令式反应式部件(例如,Chip 类)。
声明式编程
小部件的构建方法通常是具有多层嵌套构造函数的单个表达式,使用 Dart 的严格声明式子集编写。此类嵌套表达式可以机械地转换为或来自任何合适的表达标记语言。例如,UserAccountsDrawerHeader 小部件有一个很长的构建方法(20 多行),由一个嵌套表达式组成。这也可以与命令式风格结合使用,以构建在纯声明式方法中难以描述的用户界面。
泛型编程
类型可用于帮助开发人员尽早捕获编程错误。Flutter 框架使用泛型编程来帮助实现这一点。例如,State 类根据其关联小部件的类型进行参数化,以便 Dart 分析器可以捕获状态和小部件的不匹配。类似地,GlobalKey 类采用类型参数,以便能够以类型安全的方式(使用运行时检查)访问远程小部件的状态,Route 接口使用预期在 弹出时使用的类型进行参数化,以及诸如 ListMapSet 之类的集合都进行了参数化,以便可以在分析期间或调试期间的运行时尽早捕获不匹配的元素。
并发编程
Flutter 大量使用 Future 和其他异步 API。例如,动画系统通过完成一个 future 来报告动画何时完成。图像加载系统也以类似的方式使用 future 来报告加载何时完成。
约束编程
Flutter 中的布局系统使用一种弱形式的约束编程来确定场景的几何形状。约束(例如,对于笛卡尔盒,最小和最大宽度以及最小和最大高度)从父级传递到子级,并且子级选择满足这些约束的结果几何图形(例如,对于笛卡尔盒,大小,特别是宽度和高度)。通过使用此技术,Flutter 通常可以使用单次传递来布局整个场景。

项目

#

我可以在哪里获得支持?

#

如果您认为遇到错误,请在我们的 问题跟踪器 中提交。您也可以使用 Stack Overflow 查找“HOWTO”类型的问题。如需讨论,请加入我们的邮件列表 [email protected] 或在 Discord 上找到我们。

有关更多信息,请参阅我们的 社区 页面。

我该如何参与?

#

Flutter 是开源的,我们鼓励您做出贡献。您可以从简单地为我们的 问题跟踪器 中的功能请求和错误提交问题开始。

我们建议您加入我们的邮件列表 [email protected] 并告诉我们您如何使用 Flutter 以及您想用它做什么。

如果您有兴趣贡献代码,您可以从阅读我们的 贡献指南 并查看我们的 简单入门问题 列表开始。

最后,您可以与有帮助的 Flutter 社区联系。有关更多信息,请参阅 社区 页面。

您还可以与 Flutter Discord 上的其他开发者互动。

Flutter 是开源的吗?

#

是的,Flutter 是开源技术。您可以在 GitHub 上找到该项目。

哪些软件许可证适用于 Flutter 及其依赖项?

#

Flutter 包括两个组件:一个作为动态链接二进制文件提供的引擎,以及作为引擎加载的单独二进制文件的 Dart 框架。引擎使用多个具有许多依赖项的软件组件;在 许可证文件 中查看完整列表。

该框架完全独立,只需要一个许可证

此外,您使用的任何 Dart 包可能都有自己的许可证要求。

如何确定我的 Flutter 应用程序需要显示哪些许可证?

#

有一个 API 可以查找您需要显示的许可证列表。

谁在开发 Flutter?

#

我们都这样做!Flutter 是一个开源项目。目前,大部分开发工作是由 Google 的工程师完成的。如果您对 Flutter 感兴趣,我们鼓励您加入社区并 为 Flutter 做出贡献

Flutter 的指导原则是什么?

#

我们相信以下几点

  • 为了覆盖每个潜在用户,开发人员需要针对多个移动平台。
  • 由于自动行为(滚动、布局)和遗留支持,如今存在的 HTML 和 WebViews 难以始终如一地达到高帧率并提供高保真体验。
  • 如今,多次构建相同的应用程序成本太高:它需要不同的团队、不同的代码库、不同的工作流程、不同的工具等。
  • 开发人员希望有一种更简单、更好的方法来使用单个代码库为多个目标平台构建移动应用程序,并且他们不想牺牲质量、控制或性能。

我们专注于三件事

控制
开发人员应该能够访问并控制系统的所有层级。这导致了
性能
用户应该拥有流畅、响应迅速、无卡顿的应用程序。这导致了
保真度:
每个人都应该拥有精确、美丽、愉悦的应用程序体验。

Apple 会拒绝我的 Flutter 应用程序吗?

#

我们无法代表苹果公司发言,但他们的 App Store 中包含许多使用 Flutter 等框架技术构建的应用程序。实际上,Flutter 使用与 Unity 相同的基本架构模型,Unity 是为 Apple Store 上许多最流行的游戏提供支持的引擎。

苹果公司经常推荐使用 Flutter 构建的精心设计的应用程序,包括 汉密尔顿Reflectly

与提交到 Apple Store 的任何应用程序一样,使用 Flutter 构建的应用程序应遵循 Apple 的 App Store 提交指南