开发企业级移动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解决方案也值得考虑,例如:

https://codemagic.io/start/ https://go.bitrise.io/flutter-ci

需要特别注意的是,尽管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
  • 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原生代码的第三方混淆器,例如:

https://www.polidea.com/blog/open-source-code-obfuscation-tool-for-protecting-ios-apps/ https://www.guardsquare.com/en/products/ixguard

请注意,Android和iOS混淆器通常不会对Flutter Dart代码的混淆产生影响,反之亦然。

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

杂项需求

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

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

错误/崩溃报告Sentry库

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

生成并扫描二维码

访问个人联系人列表

与社交媒体共享详细信息

发送短信和彩信。

接收一次性短信密码。

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

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

其他开发中的应用内支付库: https://pub.dev/packages/flutter_billing https://pub.dev/packages/flutter_inapp_purchase

播放音频/音乐/视频

读取用户的健康信息

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

还有谁在使用Flutter?

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

https://flutter.dev/showcase https://www.thedroidsonroids.com/blog/apps-made-with-flutter

结论

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

原文链接https://medium.com/digio-australia/is-flutter-ready-for-enterprise-mobile-apps-e3e9a0f11bea

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/231FdV7Py79XAtreuZeX
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动