灵魂拷问:flutter构建应用的方式是否是一种倒退?

Posted BUGgogogo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了灵魂拷问:flutter构建应用的方式是否是一种倒退?相关的知识,希望对你有一定的参考价值。

前言

前一阵子有一个网友问了我一个问题:

在以往软件或者应用开发中,不管是哪种设计模式,mvc也好,mvvm也好,通常都是布局和代码逻辑各自独立,比如微软体系下软件开发下用xaml写布局cs代码写逻辑,诸如此类的苹果安卓都是这样。

这样的做法的诞生,在当时应该是一种进步。但是谷歌新移动端框架flutter是布局跟代码逻辑又一起写了。这是退步还是螺旋上升到这个阶段了?

顺便这位网友还向我吐槽了一下 Flutter 的括号。

今天就在这里好好说一下这个flutter吧。

浅谈Flutter的未来

3月4日,谷歌正式发布了 Flutter 的 2.0。该版本最大的特性就是可以支持五大主流的操作系统:iosandroid、Linux、Windows 和 MacOS。官方甚至还说丰田将会把 Flutter 带到汽车中。

也就是说,我们可以用一套 Flutter 代码适配全平台了。一切似乎都是朝着好的方向发展。

但是,不少人心中都有一个疑惑:flutter构建应用的方式是否是一种倒退?Flutter不是正在被放弃吗?

其实这个问题一直都有人在问,在这里,我就直接引用阿里的闲鱼团队客户端负责人于佳(宗心)的话吧:

跨平台本身的对企业来说在成本侧是有很大的诉求的,在未来操作系统有可能走向分裂,多终端的场景下,Flutter 会有比较不错的发展。在生态更加完善后,Flutter 会在一定的历史阶段成为客户端研发的另一种常见的技术选择。

上月初,谷歌正式发布的 Flutter 2.0版本最大的特性就是可以支持五大主流的操作系统:iOS、Android、Linux、Windows 和 MacOS。

也就是说,用一套 Flutter 代码适配全平台已经不再遥远。

他的观点笔者深以为然。

我看Flutter

个人感觉Flutter比安卓开发的心智负担要更低。

用统一的语言和代码实现所有功能,需要记忆的细节更少一些,因为所有东西都是dart的widget类,交互起来都是一摸一样的。而xml和逻辑分开写尤其是在动态改变元素的时候就会潜意识的纠结写在哪里,而且各种诸如inflate之类的细节都要记住。

关于逻辑界面分离

BLoC模式是我目前见过的逻辑界面分离的最彻底最直白的模式,主要是因为dart对于Stream的支持和flutter的StreamBuilder,FutureBuilder等一系列内置控件。

而本来就应该结合在控件内部的简单逻辑,flutter写起来更方便,直接原样写进build(context)里。

针对网友的提问

这个其实感觉更多的是取决于Flutter的定位。

看看MVC和MVVM,都是基于应用层或者服务层提出的设计模式。因为对于一个Web应用,或者客户端APP,UI是一部分,但除了UI,还有业务实现,网络请求,数据管理等。如何将这几个部分有效结合,同时合理分层,利于维护和扩展,避免冲突,这是工程要解决的问题,所以有了MVC,MVP,MVVM这些设计模式。

再来看看Flutter,现在它的主要定位还是一个UI框架,只是说对于普通的UI框架,它可以跨端的同时保持了近乎原生级UI性能,但它的本质还是和UI框架。也就是说,它的核心能力就是生产一个个大大小小的Widget,然后将它们组织起来,管理它们的状态,再换个角度说,Flutter就是这些MVx模式中的V。从这点去思考,应该就不难理解为何Flutter会设计成直接在代码中写布局了,因为它们都是同一层的事情,没必要分开。React会考虑CSS-in-JS,以及直接在JS中写类html标签(JSX)应该也是一样的道理。React的定位就是一个UI库,和UI相关的,样式,布局,事件,写在一起,没毛病。如果开发者不习惯或者坚持分离的原则,可以自己扩展,于是就有了琳琅满目的React模块。

所以,我认为Flutter构建应用的方式不是一种倒退,是基于定位的一种合理方案,虽然不一定是最优解,但是合理的。谁也不知道最优解是怎样的,取决于开发者自身的习惯,取决于项目的规模,取决于公司团队的规约等等。那么Flutter完全可以把一部分工作交给社区,交给开发者。如果开发者觉得代码里写布局不优雅,那就通过其他模块或者插件去扩展能力。Flutter的核心能力是制造widget管理widget,如果想让它一直保持活力,需要的不仅仅是开发者通过它来造widget,还要为它造“widget”。

还有就是,题主觉得Dart的代码最后是一堆的}}}…},问题主要不在语言,或者框架的设计本身,关键在开发者组织代码管理代码的能力。以我的经验,任何形式风格的代码,任何逻辑实现,然后方法的调用,但凡是一堆),或者一堆},或者缩进很深的,说明你的代码需要review和refactor了。

笔者感想

其实现在很多开发者都对 Flutter 有偏见。因为感兴趣和爱好而去主动钻研的人不算多,但是我还是想说,Flutter 他值得!

为什么 Flutter 对Android开发来说值得?

1.Flutter 有很多优点

(1)国际化方案非常友好

Flutter官方提供的国际化方案对布局的国际化做的非常友好,文案的国际化在Flutter Intl插件的加持下也非常简单。(或许微不足道,但是真的超级方便)

(2)执行效率高

就目前市场的大环境来讲,主流的跨端方案有两种:

  • javascriptCore 引擎当作虚拟机的方案,代表框架是 React Native;
  • 使用非 JavaScriptCore 虚拟机的方案,代表框架就是我们今天的主角 Flutter。

JavaScriptCore, 主要是为了兼容 Web 标准留下的历史包袱,无法专门针对移动端进行性能优化。而 Flutter 一开始就是使用全新的 Dart 语言编写,同时支持 AOT 和 JIT 两种编译方式,而没有采用 HTML/CSS/JavaScript 组合方式开发,在执行效率上明显高于 JavaScriptCore 。

(3)降低成本,减少双端投入

闲鱼技术团队决定 Dart First的时候主要就是因为这一点,降低组织成本、学习成本、协同成本。架构的一致性对研发效能和质量也有很大的帮助。

Flutter 还有更多优点等待大家在实践中发掘。

2.Flutter 是市场的选择

如下图,这是手机上用 libChecker 统计出来的部分使用 Flutter 的应用:

我们可以看到,现在 Flutter 正在被很多大公司采用:

  • 京东的京东读书
  • 阿里的闲鱼
  • 腾讯的微信和 Now 直播
  • 字节跳动的西瓜视频
  • ……

一个新技术的普及,企业级应用一定会先在头部互联网企业产生,然后逐步优化降低门槛。现在用 Flutter 的大厂越来越多,相信那个爆发的临界点应该不远了。

Flutter 现在已经不是曾经的小众框架,它已经逐步成长为主流的跨平台开发框架之一。

3.Flutter 是找工作的加分项

Flutter目前也是Android开发岗位的加分项,下面是我在Boss上面搜到的一部分招聘信息。

通过上图我们可以看出,很多大厂在高薪招聘这方面的人才,Flutter 确确实实可以成为我们找工作的一个帮助。

Flutter 也可以帮助到我们的职业发展。技术是相通的,当我们在学习Flutter时,也能把原有的技术联通、打通。我们可以通过 Flutter 放大自身业务开发能力,参与到更多的平台开发中。

有一个说法是:对于 Android 原生开发来说,学会 Flutter 等于学会了 70% 以上的 Jetpack Compose 。

Android开发该如何快速上手Flutter?

当你快速搭建好环境,简单了解 Flutter 的 API 之后,你的 Flutter 学习之路需要面对的主要有两个核心点:一个是响应式开发,另一个是弄懂 Widget 的背后是什么?

这两点对我们Android开发来说都有一定的难度。

为了让大家快速无痛上手 Flutter,在这里免费分享给大家一份来自阿里大佬Git高星的 Flutter 学习笔记。

整理大纲

  • 为什么Flutter是跨平台开发的终极之选
  • 在Windows上搭建Flutter开发环境
  • 编写您的第一个 Flutter App
  • Flutter开发环境搭建和调试
  • Dart语法篇之基础语法(一)
  • Dart语法篇之集合的使用与源码解析(二)
  • Dart语法篇之集合操作符函数与源码分析(三)
  • Dart语法篇之函数的使用(四)
  • Dart语法篇之面向对象基础(五)
  • Dart语法篇之面向对象继承和Mixins(六)
  • Dart语法篇之类型系统与泛型(七)
  • Flutter中的widget

点击我的GitHub,直达我们千人技术交流圈。共享文件夹自取,密码找管理员

资料详情

为什么Flutter是跨平台开发的终极之选

  • 这是为什么?
  • 跨平台开发
  • 什么是 Flutter
  • Flutter 的特性
  • Flutter 构建应用的工具
  • 使用 Flutter 构建的热门应用
  • 构建 Flutter 应用的成本
  • ……

在Windows上搭建Flutter开发环境

  • 使用镜像
  • 系统要求
  • 获取Flutter SDK
  • 编辑器设置
  • Android设置
  • 起步: 配置编辑器
  • 起步: 体验
  • 体验热重载
  • 创建新的应用
  • 运行应用程序
  • ……

第三章 编写您的第一个 Flutter App

  • 第1步: 创建 Flutter app
  • 第2步: 使用外部包(package)
  • 第3步: 添加一个 有状态的部件(Stateful widget)
  • 第4步: 创建一个无限滚动ListView
  • 第5步: 添加交互
  • 第6步: 导航到新页面
  • 第7步:使用主题更改UI
  • ……

第四章 Flutter开发环境搭建和调试

  • 开发环境的搭建
  • 模拟器的安装与调试
  • 开发环境的搭建
  • 模拟器的安装与调试
  • ……

第五章 Dart语法篇之基础语法(一)

  • Hello Dart
  • 数据类型
  • 变量和常量
  • 集合(List、Set、Map)
  • 流程控制
  • 运算符
  • 异常
  • 函数
  • ……

第六章 Dart语法篇之集合的使用与源码解析(二)

  • List
  • Set
  • Map
  • Queue
  • LinkedList
  • HashMap
  • Map、HashMap、LinkedHashMap、SplayTreeMap区别
  • 命名构造函数from和of的区别以及使用建议
  • ……

第七章 Dart语法篇之集合操作符函数与源码分析(三)

  • Iterable(Iterable类关系图、Iterable类方法图……)
  • forEach(介绍、使用方式、源码解析……)
  • map(介绍、使用方式、源码解析……)
  • any(介绍、使用方式、源码解析……)
  • every(介绍、使用方式、源码解析……)
  • where(介绍、使用方式、源码解析……)
  • firstWhere和singleWhere和lastWhere(介绍、使用方式、源码解析……)
  • join(介绍、使用方式、源码解析……)
  • take(介绍、使用方式、源码解析……)
  • takeWhile(介绍、使用方式、源码解析……)
  • ……(内容太多)

第八章 Dart语法篇之函数的使用(四)

  • 函数参数
  • 匿名函数(闭包,lambda)
  • 箭头函数
  • 局部函数
  • 顶层函数和静态函数
  • main函数
  • ……

第九章 Dart语法篇之面向对象基础(五)

  • 属性访问器(accessor)函数setter和getter
  • 面向对象中的变量
  • 构造函数
  • 抽象方法、抽象类和接口
  • 类函数
  • ……

第十章 Dart语法篇之面向对象继承和Mixins(六)

  • 类的单继承
  • 基于Mixins的多继承
  • ……

第十一章 Dart语法篇之类型系统与泛型(七)

  • 可选类型
  • 接口类型
  • 泛型
  • 类型具体化
  • ……

第十二章 Flutter中的widget

  • Flutter页面-基础Widget
  • Widget
  • StatelessWidget
  • Stateful Widget
  • State生命周期
  • 基础widget
  • 文本显示
  • ……

点击我的GitHub,直达我们千人技术交流圈。共享文件夹自取,密码找管理员

最后

希望这份资料可以给想要了解 Flutter 并快速上手的朋友帮助以及一个参考方向。

以上是关于灵魂拷问:flutter构建应用的方式是否是一种倒退?的主要内容,如果未能解决你的问题,请参考以下文章

漫画:JVM 灵魂拷问“你是什么垃圾?”

灵魂拷问之调度与切换十六问

灵魂拷问第4篇:说一说从输入URL到页面呈现发生了什么?——解析算法篇

灵魂拷问:如何检查Java数组中是否包含某个值 ?

阿里面试官:请问蓝牙设备如何测试?灵魂拷问!我人傻了!

灵魂拷问第6篇:谈谈你对重绘和回流的理解