开发企业级移动 APP,Flutter 准备好了吗?
Flutter 及其库 / 包生态系统是否已经准备好构建企业级应用程序了呢? 本文 将从架构、开发环境、用户界面、访问硬件功能、安全性等需求角度入手,探讨使用 Flutter 开发一款企业级应用程序的可行性。
上一次我关注 Flutter 时它才刚刚发布了测试版,彼时它已经展现出很大的潜力,但尚有许多原生功能必须通过 Flutter 和原生平台的混合实现来达成。这就需要为 Flutter 编写 Dart,为 Android 编写 Java/Kotlin,并为 iOS 编写 Objective C/Swift。
快进到今天,一年过去了,现在已经有 4000 多个可用于 Flutter 应用的库。Medium、YouTube、StackOverflow 充斥着——甚至可以说是溢出了——有关如何使用 Flutter 实现各种目标的文章。很多地方有专门针对 Flutter 的电子邮件列表。Flutter SDK 是 GitHub 上增长第二快的项目。所有这些都表明了 Flutter 有一个蓬勃发展的社区,他们渴望分享、成长和改善 Flutter。
综上所述,我认为现在是时候来研究特定的需求了,那就是探究 Flutter 及其库 / 包生态系统是否已经准备好构建企业级应用程序。
这些需求来自于我研究的企业级 Android 应用中需要特别关注的领域。不能满足其中某些需求的话,Flutter 对这些应用来说就只会是走过场而已。
我的目的是为每种需求找到至少一个 Flutter 解决方案,以表明 Flutter 现在已准备好构建企业级应用,同时几乎不需要混合编码。除此之外,你可能还有其他需求,因此你的答案可能有所不同。
我的需求分为以下几个方面:
- 架构
- 开发环境
- 用户界面
- 访问硬件功能
- 安全性
- 杂项
对于每种需求,我都提供了链接作为进一步探讨的起点。由于涉及的领域如此之多,因此本文仅包含了简短的摘要。我假定读者已经熟悉 Flutter 的基本功能。接下来,我们开始吧!
架构
企业级应用的架构应该将关注点清晰地分成多个层次,以实现:
- 众多开发人员、团队同时开发代码库;
- 有丰富文档的设计模式,从而更容易理解一系列应用功能。
这样一来就可以全面提升众多团队的生产力,即便这些团队的技能水平参差不齐也不是问题。
Flutter 为 Web 资源、本地存储、Sqlite 数据库以及使用库插件访问硬件提供了简单而安全的途径。
状态管理是 Flutter 应用架构的核心。谷歌最近推荐使用的 Provider 框架 容易理解,也容易用它来构建。还可以使用其他状态管理方法,如 Redux、BLoC、InheritedWidget 和 setState 等,它们可以在合理范围内共存。
依赖注入是一种设计模式,旨在使代码单元尽可能独立和可复用,这也使代码更容易进行单元测试。 GetIt 定位器 是一种易用的 DI 库,可与状态管理框架(如 Provider)搭配,分离多个应用层。
如果 Dart 的 streams 和 async 包不足以满足你的异步编程需求,那么还有 ReactiveX 可用,后者是一种流行的、基于可观察事件流的异步编程风格。 RxDart 与 Flutter 和状态管理框架集成得很好。
Flutter 的后台处理允许在应用中执行计算密集型工作,同时保持 UI 响应能力。Dart 的隔离(isolate)是在后台线程上执行工作的(略为复杂的)基础,而计算包装器函数简化了最常见用例的隔离工作。根据你对后台处理需求的复杂程度,可能需要采用原生平台功能,而不仅仅是纯粹的 Dart 实现。这方面的详细信息请参考下方链接:
https://flutter.dev/docs/development/packages-and-plugins/background-processes
JSON 序列化 / 反序列化对于多数企业级应用中常见的任何 RESTful 客户端都是必不可少的。
导航和返回栈管理是一项基本要求,但可能还有特定的需求,以在支持底部导航的应用中跨多个选项卡维护多个返回栈,这在 iOS 用户体验中很常见。
Flutter 的深度链接可从网站或推送通知中提供导航,以跳转到应用内的特定区域。
即使应用处于后台或停止状态,也可以使用少量键 / 值数据的本地存储来持久存储数据。
SQLite 可用于处理大量结构化数据。
Flutter 还提供了基于应用权限的,对每个平台文件系统的读 / 写权限。
企业级的推送通知通常需要后端集成,例如通知用户其信用卡已逾期的场景。Firebase 消息传递就是这样一种解决方案。如果本地通知是基于日程表之类可以在设备上完整触发的数据,可以使用这个库:
https://pub.dev/packages/flutter_local_notifications
开发环境
开发人员选择 Flutter IDE 时,有 Android Studio、IntelliJ 和 Visual Studio Code 三种选项,它们都能很好地支持 Mac、PC、Linux 和 Chromebook。构建、设备部署、调试和性能分析工作都能用这些 IDE 完成,使用命令行也可以。原生 iOS 平台的开发 / 部署则需要 Mac 上的 Xcode。
可扩展性:Flutter 应用具有天然的可扩展性,因为它基于 Dart 生态系统,导入了 Dart 包以提供外部库的功能。Flutter 项目可以重构为 Flutter Dart 包,从而为开发企业级应用的大型开发团队提供另一种分散工作的方式。
可测试性:可以使用 Flutter 随附的三个测试框架来测试 Flutter 小部件和非 UI 代码工件。这三个框架分别是单元测试、小部件测试和集成测试。这样可以最大程度地覆盖测试,只受可用时间和资源的限制。可以使用 mock_web_server 对应用内的 mock Web 服务器运行完全自包含的集成测试。如果提供了一种在 Web 服务器端点之间切换的方法,则使用这个 mock Web 服务器也可以实现应用的自包含(即没有到应用外部的 Web 请求)演示版本。例如,你可以在企业应用的调试版本中,在 mock、测试环境和生产前测试环境之间切换。
持续集成 / 持续交付:Flutter 使用底层的 Android 和 iOS 工具集将应用部署到 Google Play 商店或苹果 App Store,因此可以与任何现有的企业移动 CI/CD 设置共存。对于新项目而言,为 Flutter 量身定制 CI/CD 解决方案也值得考虑,例如:
需要特别注意的是,尽管 Flutter 开发人员可以将大部分时间都花在 Flutter/Dart 环境中,但 Flutter 应用最后是要部署到 Android 和 iOS 设备上的。所以学习底层原生平台的知识,尤其是部署知识是必要的。了解如何构建和签名应用以及准备配置文件等知识,对于打造成功的 Flutter 应用至关重要。Flutter 开发人员的另一项基本技能是在各个原生平台上调试,并了解如何读取两个截然不同的平台的堆栈跟踪。
用户界面
企业级移动应用非常重视并需要提供出色的用户界面,Flutter 附带了一套完整的、高度精确的 rendition,分别提供 Android(Material Widgets)和 iOS(Cupertino Widgets)版本。
Flutter 的动画 很容易入门,还可以扩展到很多复杂性级别上,带有 Flare 的成熟的 2D 矢量动画库。
页面过渡 是在需要最大化 UI 弹出的情况下实现应用页面之间带动画导航的示例。
当要向用户显示大量数据而又不消耗大量设备内存时,分页 / 无限滚动列表视图是常见的需求。这里是一个教程:
https://flutter-academy.com/flutter-listview-infinite-scrolling/
如果基本的图像(image)或 SVG 图像还不够用, 图像加载 / 缓存库 提供了一种轻松的方法来处理带缓存的多个图像。
Flutter 还可以访问谷歌地图和苹果地图: https://pub.dev/packages/flutter_maps
Flutter 也能 访问平台的 Web 视图 ,不过该功能尚处于开发者预览状态,会有一些警告。
国际化 也是支持的。
Flutter 支持辅助功能 。在使用原生 Android 辅助功能时,某些功能可能难以在整个应用中实现,或者成本很高。因此,如果你在这一领域中有任何特定要求,必须执行概念验证以确保操作正确。
图表库 提供了一种简单的方法来可视化数据序列,如条形图、饼图和折线图等。
访问硬件功能
对于企业级移动应用来说,访问设备硬件功能是很重要的需求,虽然有时这只是为了充门面,例如:
- 相机;
- 生物特征认证(包括指纹和面部识别码);
- GPS;
- 加速度计;
- NFC。请注意,这里仅支持 NFC 标签的子集,并且苹果在 iOS 平台上严格限制了 NFC 应用,这并不是 Flutter 的问题。
安全性
安全性在企业级应用中至关重要。这是一个非常广泛的主题,我将其缩小为几个特定主题以控制文章长度。Flutter 建立在 Android 和 iOS 应用沙箱环境上,因此每个 Flutter 应用都继承了原生 Android 和 iOS 应用固有的安全性,包括能够通过 https 与外部网站进行安全通信的能力。
身份验证之类的基本要求已得到很好的满足。Flutter 的 Simple Auth 支持集成到以下身份验证提供方:
- Azure Active Directory
- Amazon
- Dropbox
- GitHub
- Microsoft Live Connect
- 任何标准的 OAuth2/Basic Auth 服务器
亚马逊还提供了自己的 Cognito SDK。
SSL 证书 pinning 减少了对安全 Web(https)请求进行中间人攻击的可能性,Flutter 也提供了支持: https://pub.dev/packages/ssl_pinning_plugin
逆向工程的难度:Flutter Dart 代码可编译为 ARM 二进制代码,因此逆向工程比 Android 字节码更具挑战性。通过使用诸如代码混淆之类的技术可以进一步“增强”此能力。代码混淆可能是一个两极分化的话题——对某些组织来说这是必须具备的,而对于另一些组织来说这只是自欺欺人,所以他们不会使用。我不会参加这里的辩论,只是要注意 Flutter Dart 代码可能会被混淆。Android 代码有自己的混淆功能,它们不是一回事。还有用于 iOS 原生代码的第三方混淆器,例如:
请注意,Android 和 iOS 混淆器通常不会对 Flutter Dart 代码的混淆产生影响,反之亦然。
安全存储 提供了一种在设备上安全存储少量键 / 值信息的方法。
杂项需求
以下是一些独立的重要需求,但不属于上面的类别。
分析: Adobe 和 Firebase 分析库都有 Flutter 支持。
错误 / 崩溃报告: Sentry 库 。
第三方 / 开源库:这里列出了 第三方库和证书 。使用第三方库时通常要求应用公开库的使用情况,并提供查看这些库证书的方式。
生成并扫描二维码 。
使用 Square Reader SDK 通过读卡器接收付款 。
其他开发中的应用内支付库:
TensorFlow Lite 和 ML Kit ,用于在设备和云端进行机器学习。
还有谁在使用 Flutter?
谷歌即将推出的云游戏服务 Stadia 选择了 Flutter 作为其 Android 和 iOS 应用的实现。想了解选择 Flutter 的其他知名公司和应用,请参见:
结论
从上面提供的链接可以看出,Flutter 库或解决方案可适用于企业级移动应用的多种需求。有这样一个健康且不断发展的 Flutter 库 / 包生态系统,也许是时候考虑使用 Flutter 开发你的下一款企业级移动应用了!