写点什么

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

  • 2019-11-20
  • 本文字数:4381 字

    阅读完需:约 14 分钟

开发企业级移动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


2019-11-20 16:515589
用户头像
王文婧 InfoQ编辑

发布了 126 篇内容, 共 72.4 次阅读, 收获喜欢 275 次。

关注

评论

发布
暂无评论
发现更多内容

k6简单入门

风中之心

性能测试

老是自以为JVM懂了,那你知道 i = i++和 i = ++i 的区别吗?

小谈

Java 面试 编程语言 JVM 程序

游戏夜读 | 跟风说一说爬虫

game1night

如何通过调试学习 nginx ?

张小方

c++ nginx 后端 高性能 服务器端开发

面试官:反射都不会,还敢说自己会Java?

码农月半

Java 面试 反射 java反射

Hexo blog 创建指导手册

想飞的鱼

GitHub Hexo GitHub Pages Blog

解决死锁的4种基本方法(建议收藏)

小吴选手

Java 死锁

架构师训练营第 5 周——学习总结

在野

极客大学架构师训练营

数酒瓶童谣:从99数到0

程李文华

超级专家术语学习机

程李文华

Cordova项目使用Android Studio真机调试

麦洛

android Android Studio 真机调试

「架构师训练营」第 5 周作业 - 一致性哈希算法

guoguo 👻

极客大学架构师训练营

你那么追捧的 SpringBoot,到底替你做了什么?

爱java爱自己

spring

Hash一致性算法的Java实现

wei

熟悉JVM吗?为什么新生代内存需要有两个Survivor区?

南南

Java 面试 深入理解JVM JVM原理

没有微服务项目经验,就别去面试官那里送人头了

小谈

Java 架构 面试 微服务 SpringCloud

工业4.0|振动分析能做到预防性维护吗?

清水河路人甲

计算机操作系统基础(十三)---线程同步之读写锁

书旅

php laravel 线程 操作系统 进程

IDEA 不为人知的 5 个骚技巧!真香!

王磊

Java 工具 IDEA

hash一致性算法与优化

Mr.Monkey

对mysql事务的认识,再不懂我就捶死我自己!

你是人间四月天

MySQL 面试 mysql事务

架构师训练营第五周 - 总结

Eric

极客大学架构师训练营

面试官80%会问的分布式事务中的“最大努力通知”事务

无予且行

Java MySQL 面试 事务

这是什么神仙面试宝典?半月看完25大专题,居然斩获阿里P7offer

码哥小胖

Java spring 面试

架构师训练营第5周-一致性hash算法总结及作业

傻傻的帅

极客大学架构师训练营

因为我的一个低级错误,生产数据库崩溃了将近半个小时

鄙人薛某

Java MySQL 数据库 故障定位

架构师训练营作业 (第五周)

王海

极客大学架构师训练营

架构师课程第五周 作业

杉松壁

深入理解ThreadLocal:拨开迷雾,探究本质

itlemon

源码分析 ThreadLocal

写给大忙人看的内存管理

苹果看辽宁体育

后端 操作系统

架构师训练营 一致性Hash算法Java实现

Cloud.

开发企业级移动APP,Flutter准备好了吗?_大前端_Gary Chang_InfoQ精选文章