22

开发企业级移动 APP,Flutter 准备好了吗?

 4 years ago
source link: https://www.infoq.cn/article/231FdV7Py79XAtreuZeX
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 的基本功能。接下来,我们开始吧!

E3m2yiv.png!web

架构

企业级应用的架构应该将关注点清晰地分成多个层次,以实现:

  • 众多开发人员、团队同时开发代码库;
  • 有丰富文档的设计模式,从而更容易理解一系列应用功能。

这样一来就可以全面提升众多团队的生产力,即便这些团队的技能水平参差不齐也不是问题。

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

Vbyuyyi.png!web

开发环境

开发人员选择 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 开发人员的另一项基本技能是在各个原生平台上调试,并了解如何读取两个截然不同的平台的堆栈跟踪。

yuqeA3y.png!web

用户界面

企业级移动应用非常重视并需要提供出色的用户界面,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 辅助功能时,某些功能可能难以在整个应用中实现,或者成本很高。因此,如果你在这一领域中有任何特定要求,必须执行概念验证以确保操作正确。

图表库 提供了一种简单的方法来可视化数据序列,如条形图、饼图和折线图等。

faAjYvr.png!web

访问硬件功能

对于企业级移动应用来说,访问设备硬件功能是很重要的需求,虽然有时这只是为了充门面,例如:

  • 相机;
  • 生物特征认证(包括指纹和面部识别码);
  • GPS;
  • 加速度计;
  • NFC。请注意,这里仅支持 NFC 标签的子集,并且苹果在 iOS 平台上严格限制了 NFC 应用,这并不是 Flutter 的问题。

iaIfiuj.png!web

安全性

安全性在企业级应用中至关重要。这是一个非常广泛的主题,我将其缩小为几个特定主题以控制文章长度。Flutter 建立在 Android 和 iOS 应用沙箱环境上,因此每个 Flutter 应用都继承了原生 Android 和 iOS 应用固有的安全性,包括能够通过 https 与外部网站进行安全通信的能力。

身份验证之类的基本要求已得到很好的满足。Flutter 的 Simple Auth 支持集成到以下身份验证提供方:

  • Azure Active Directory
  • Amazon
  • Dropbox
  • Facebook
  • GitHub
  • Google
  • Instagram
  • LinkedIn
  • 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 代码的混淆产生影响,反之亦然。

安全存储 提供了一种在设备上安全存储少量键 / 值信息的方法。

aMZRfiy.png!web

杂项需求

以下是一些独立的重要需求,但不属于上面的类别。

分析: AdobeFirebase 分析库都有 Flutter 支持。

错误 / 崩溃报告: Sentry 库

第三方 / 开源库:这里列出了 第三方库和证书 。使用第三方库时通常要求应用公开库的使用情况,并提供查看这些库证书的方式。

生成并扫描二维码

访问个人联系人列表

与社交媒体共享详细信息

发送短信和彩信。

接收一次性短信密码。

使用 Square Reader SDK 通过读卡器接收付款

使用 Square 应用内支付 SDK 进行应用内付款

播放音频/ 音乐 / 视频

读取用户的健康信息

TensorFlow LiteML Kit ,用于在设备和云端进行机器学习。

还有谁在使用 Flutter?

谷歌即将推出的云游戏服务 Stadia 选择了 Flutter 作为其 Android 和 iOS 应用的实现。想了解选择 Flutter 的其他知名公司和应用,请参见:

结论

从上面提供的链接可以看出,Flutter 库或解决方案可适用于企业级移动应用的多种需求。有这样一个健康且不断发展的 Flutter 库 / 包生态系统,也许是时候考虑使用 Flutter 开发你的下一款企业级移动应用了!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK