推荐期刊

基于 Flutter 的跨平台的工业移动应用软件设计

时间:2021-04-09 10:21:21 所属分类:软件开发 浏览量:

近年来,随着信息技术的发展,工业软件架构开始从传统的 C /S 架构向 B /S 架构与混合架构转变[1 - 3],工业软件开发也从 Windows Native 向 electron 等跨平台桌面程序转变。与此同时,随着智能工厂、工业互联网的概念日益火热[4 - 5],移动应用在工业领域

  近年来,随着信息技术的发展,工业软件架构开始从传统的 C /S 架构向 B /S 架构与混合架构转变[1 - 3],工业软件开发也从 Windows Native 向 electron 等跨平台桌面程序转变。与此同时,随着智能工厂、工业互联网的概念日益火热[4 - 5],移动应用在工业领域的应用也呈现出增长之势[6]。目前市场上,基于 Android 操作系统的工业 PDA 与工业平板计算机最为主流,也有少量 Windows 操作系统、基于 Linux 内核的操作系统的工业平板计算机。在一些非防爆区域,基于 iOS( iPadOS) 的 iPad 也是一个常见的选择。作为开发者,如果同时面向所有平台开发原生应用势必会带来庞大的工作量,但是如果单纯使用 Web 端,则又缺少了很多原生功能。因此,许多开发者将目光转向了跨平台开发架构,例如 Flutter、React-Native 等。本文将以 Flutter 框架为基础,以在批量控制系统中的应用为例,阐述选择 Flutter 框架的缘由以及相关 Android 应用软件设计与开发过程。

基于 Flutter 的跨平台的工业移动应用软件设计

  1 Flutter 概述

  Flutter 是谷歌开发并开源的跨平台 UI 框架,提供 Material 与 Cupertino 两套预定义的小部件。目前 Flutter 稳定版支持 Android、iOS( iPadOS) 操作系统。 Flutter 拥有基于 C/C + + 的 Skia 渲染引擎,配合 Dart VM 与 libtxt,实现了几近原生级别的用户体验。相比 React-Native、Cordova 等跨平台技术,Flutter 不需要额外的 JavaScript 桥,因而性能更好、UI 渲染更流畅[7]。 Flutter 使用了类似于 React、SwiftUI 的基于状态管理的声明式开发,提供支持热重载的 JIT 与高性能的 AOT 两种运行方式,为开发者提供了极大的便利。在跨平台开发中,与原生交互的问题往往是难以避免的。本文所述的应用于批量控制系统的工业移动应用软件属于业务密集型应用软件[8],对于原生功能的需求不强,因此十分适合使用跨平台框架开发。

  2 软件设计

  本文所述软件示例包含批量控制的基础功能,例如,批次查看、批次控制、批次操作等。但其设计在一定程度上拥有较大的可拓展性,以满足日后不断增加的需求。

  2. 1 架构设计软件基本架构如图 1 所示,软件从结构上可以分为 Flutter 部分和 Android 原生部分。Android 部分实现了提供平台专有特性的封装,比如接入特定厂家提供的外设等。

  Flutter 部分包括 SDK 层、工具层以及业务层。其中: SDK 层提供 Flutter 与 Dart 的基础功能,包括 UI 组件、渲染、IO、数据转换、异步操作、原生交互等。工具层接入了一些第三方模块,并且封装了部分 SDK 的基础功能为业务层所用,具体模块如表 1 所示。业务层通过工具层提供的接口,实现各种与批量 Web 服务器之间的数据交换接口、用于全局状态管理的 Bloc,以及所有 UI 与页面路由。

  2. 2 全局状态管理与业务逻辑分离 Flutter 提供了组件级的状 态管理 ( Ephemeral State) 和基于 Provider 的 ChangeNotifier 的跨组件状态管理。前者实现全局状态管理需要大量的、重复的回调函数,后者不方便业务逻辑封装。针对这些问题,本文选用了 Bloc 作为全局状态管理工具。 Bloc 意为业务逻辑组件( Business Logic Component) ,旨在将 UI 与业务解耦,提高代码的可维护性。遵循 Bloc 模式还有利于增强可测试性与可重用性,提高可拓展性与代码可读性。示例应用的 Bloc 层设计如图 2 所示。业务逻辑层包含身份验证模块、批次管理模块、批次控制模块、历史批次模块等,每一个模块对应一个 Bloc。以身份验证模块为例,身份验证模块对应 Authentication Bloc,包含一个用于映射事件到状态的流生成器 mapEventToState 与一个用于存储身份验证信息的 Authentication Repository。其中 mapEventToState 简易流程如图 3 所示。 Bloc 通过 BlocProvider 或 MultiBlocProvider 将 Bloc 注入 BuildContext 向子组件提供 Bloc。在子组件中使用 BlocBuilder、BlocListener、MultiBlocListener 或 BlocConsumer 获取或监听 State 变化,从而对组件进行更新。

  2. 3 REST API 与 Protobuf REST API 来自于批量 Web 服务器,Web 服务器往往承载着面向多端的数据交互任务。然而对于不同平台,开发者往往需要再专门开发特定语言专用的 SDK 或适配器,这项工作既枯燥又繁琐。Protobuf 正是目前解决这一问题的最好方法,开发者只需要编写 Protobuf 消息,使用 protoc 及相关插件即可生成多种语言的消息序列化与反序列化的代码。Protobuf 还提供了序列化为二进制或 JSON 格式两个选择,使用二进制会大大提升传输效率与解析效率,使用 JSON 则可以方便调试、增加可读性[9]。

  2. 4 注入依赖 Bloc 依赖于 Repository,API 依赖于 HTTP 客户端,数据持久化依赖于 shared_preferences,依赖与被依赖的关系在程序中经常出现,过渡的依赖会导致代码的可维护性降低。因此需要把控制权抽离,并交由第三方处理,即控制反转( IOC,Inversion of Control) 。在开发过程中,只需要从第三方容器( IOC 容器) 获取并向类中注入依赖,即可实现依赖解耦。轻量级服务定位器库 get_it 提供了一种高效的 IOC 容器和依赖之间的依赖关系处理方式。

  2. 5 UI 设计 Flutter 向开发者提供了 Material 与 Cupertino 两套预定义的 UI 组件库。从历次的官方调研与 Github Issues 反馈可知,开发者普遍对 Material 库兴趣更高、好评更多、社区更活跃。Flutter 官方的路线图上也将 Material 库作为不同平台的优先开发适配的 UI 库。另一方面,Flutter 作为跨平台框架,在设计和开发过程中应当考虑不同屏幕的适配问题。Material Design 要求应当根据断点设计响应式的 UI 布局。

  3 外设接入与原生开发

  工业移动应用软件通常需要各类外设的支持,比 如: 激光扫码、身份证验证、RFID 读取、红外摄像等。使用这些外设则需要使用特定平台的 SDK 或使用广播的方式接收数据。如图 4 所示,Flutter 与 Android 之间约定一个通道,两者之间可以互相调用( invoke) 方法并回调返回数据,从而实现两者之间数据交换。

  一些工业级 PDA 或平板也提供了系统级的应用程序来为外设接入提供便利。图 5 提供了一种激光扫码的接入方式。系统级的应用程序负责控制外设硬件,当接收到扫码数据时,通过系统广播通知所有应用软件。应用软件接收到广播后,经由 MethodChannel,将二维码数据发送到 QrcodeBloc 中。QrcodeBloc 负责解析二维码,若解析失败,则直接通知用户扫码失败; 若解析成功,则向某一业务模块发送 Event。该业务将根据 Event 刷新数据或界面,通知用户扫码结果。为了保证软件兼容性,图 5 所示的接入方式依然保留了传统摄像头扫码方式。

  4 国际化解决方案

  Flutter 官方和 Flutter 社区有许多优秀的国际化解决方案,例如 i18n_extension 和 easy_localization。 i18n_extension 使用扩展的方式将多语言实现添加到 String 类型中,开发者只需要从字符串的一个 Getter 中取值即可。i18n_extension 还优化了使用 ID 映射翻译语句的设计,以往的国际化通常是使用一个特定的 ID 和当前语言来查找翻译语句,这种方式对于开发者而言不够直观; 而 i18n_extension 使用某一特定语言的翻译语句作为 ID,如此可以大大提升代码的可读性。 easy_localization 相比 i18n_extension 提供了代码生成器与多种文件解析器,可以更方便接入其他技术栈的多语言方案。

  5 结束语

  本文介 绍 了 Flutter 框架并系统性描述了基于 Flutter 的移动工业应用软件的设计与开发方式,进一步验证了 Flutter 在移动工业应用软件中使用的可行性,为开发者提供了一种高效、便捷的开发方式,从而帮助自动化厂商更快搭建移动平台解决方案。

  参考文献:

  [1] 张国慨. 基于 C/S + B/S 混合模式架构下的风电厂监控系统设计[J]. 电脑编程技巧与维护,2016( 9) : 32 - 33.

  [2] 马文涛. B/S 架构下的组态软件设计[D]. 青岛: 山东大学,2014.

  [3] 郑辉,史国芳,施尹志,等. 批次报表软件在批量生产中的应用[J]. 仪器仪表标准化与计量,2019( 4) : 17.

  [4] 王玉芹,许冬涛,丁玉林,等. 智能巡检定位系统在神宁煤化工安全生产管理中的应用[J]. 自动化应用,2017( 10) : 140 - 142

  《基于 Flutter 的跨平台的工业移动应用软件设计》来源:《仪表技术》,作者:汪若彪,史国芳,施尹志,余坦对,陈 晖

转载请注明来自:http://www.zazhifabiao.com/lunwen/dzxx/rjkf/48143.html