如何评价Flutter?

哈喽,我是老刘

我们团队使用Flutter已经快6年了。
有很多人问过我们对Flutter的评价。
今天在这里回顾一下6年前选择Flutter时的原因,以及Flutter在这几年中的实际表现如何。

选择Flutter时的判断

1、性能

最开始吸引我们的就是其优秀的性能。
特别是独立渲染引擎,从架构上避免了其它基于原生渲染的跨平台框架的先天问题。

image.png

2、高度的两端一致性

Flutter的最大魅力之一在于其跨平台能力,能够实现iOS和Android两端的高度一致体验。
也是得益于其独立渲染的架构,不需要再在不同端上分别进行UI细节的调试。

3、和原生的无缝衔接

Flutter本身提供的channel机制,以及Flutter工程能够和原生工程混合的特点是我们的刚需。
我们的项目已经上线运行好几年了,如果切换到跨平台需要把所有功能重新开发一遍,那是没法接受的。
所以类似Flutter这种能无缝融入原生项目的方案才是我们的选择。

4、开发效率

这可能是大多数团队选择跨平台框架的重要原因之一了吧。
但事实上一份代码多平台运行,不仅仅是减少了一个平台的开发量。
它同时还因为避免了不同平台程序员因为思路不同导致的多端逻辑差异。
而这种逻辑差异很多时候会对开发效率造成严重影响。

5、客户端上最好的TDD支持

对于注重软件质量的我们来说,Flutter提供的优秀测试支持是一大福音。
 

image.png


TDD是我一直以来最为推崇的软件工程方法。
但是在客户端上因为其效率极低的单元测试解决方案,让TDD成为了一个极为复杂的事情。
Flutter的优秀单元测试能力,为客户端领域实现有实战价值的TDD流程带来了新的可能性。

使用六年,当初的判断都对了吗?

1、性能媲美原生

在大多数日常使用场景中,Flutter应用的性能几乎可以与原生应用媲美,用户难以察觉到差异。
特别是随着Impeller渲染引擎的引入,Flutter在图形处理和动画方面的表现更令人期待。
当然在极少数极端性能要求下,Flutter相较于原生应用仍可能略显逊色。
不过这也让Impeller更被期待了。

2、两端一致性非常好

早期因为原生和Flutter页面混杂情况比较多,每个需求都要安排Android和iOS各一个开发
从中期开始,我们发现一个开发者就能高效地完成大部分工作,另一端的同事仅需在遇到特定原生集成问题时提供支持。
到了后期,Flutter几乎成为新功能开发的唯一选择,大大简化了团队结构和沟通成本。
这时只需要安排一个开发即可,偶尔碰到原生问题协调另一端的原生开发临时帮忙看一下就行。

3、长期使用原生+Flutter的混合开发模式

我们的项目在切换到Flutter之前,已经上线很多年了。
经过不停的发展、迭代,已经积累了大量没有记录在文档中的隐藏功能和代码逻辑。
换句话说就是你不动他们,他们就能正常运行,
你随便改一点,就不一定会回发生什么事情。
所以我们最开始选择Flutter的时候,选择的策略就是混合开发、逐步过渡。

最开始的时候只把少数页面切换到Flutter上进行灰度测试。
确认了Flutter的稳定性和用户体验没有问题后才开始把Flutter座位正式项目的首选。
但也不是把所有的页面都迁移到Flutter。
而是新项目、新页面优先采用Flutter开发,老页面仍然保留原生。
只有在新需求中老页面的变动超过50%,才考虑迁移到Flutter重做一遍。
经过这几年的逐步替换,目前常用页面的80%已经切换到Flutter上面了。
剩下的页面有历史原因,有技术原因。
但是我们打算长期保持这种混合开发的状态,不会整体切换到Flutter。
这种灵活性让Flutter在保持跨平台优势的同时,没有牺牲对平台特性的支持。

4、开发效率比两端单独开发时节省60%的人力

近期的项目开发效率,对比切换到Flutter前,整个团队效率大约提升了60%。
这可能和很多人感觉的不太一样,大家普遍觉得会节省一半人力或者更少一点。
这主要取决于以下几个方面:
第一,真正的只写一次代码
不同于很多跨平台框架,仍然需要在不同的端上进行微调。
Flutter是真正意义的只写一次代码,调试通过后一般不需要再在各个平台进行二次调试了。
这部分确实是节省了40%以上的人力。
第二,高度两端一致性
我觉得这一点上收益最大的是产品和测试团队。
对产品团队来说,没有了以前一个功能点Android需要一周、iOS需要一天这种奇特的情况。
整个项目安排比以前顺畅和可控了很多。
对于测试团队来说,过去一个项目开发完,你去看bug列表,基本上Android和iOS是完全不一样的。
现在虽然为了保证质量,仍然会区分Android和iOS进行测试。
但是基本上一个Android和iOS发现的是一个bug,也只需要修改一次。
测试和回归的工作量就少了很多。
第三,TDD对开发流程的优化
基于Flutter的TDD流程给我们团队带来了很多影响比较深远的改变。
比如更可控的项目进度,更好的代码质量等等。
可以说TDD带来的人力成本的节省不次于少写一份代码。
下面就看看TDD都带来了哪些好处?

TDD带来的开发体验优化

a、提高代码质量
TDD迫使开发者从一开始就思考代码的设计和接口,这有助于编写出更加模块化、可重用和可维护的代码。
通过持续的测试,可以确保新添加的代码不会破坏现有功能。
b、加速开发流程
虽然TDD在项目初期可能会稍显缓慢,主要是因为人员的不熟悉。
但随着项目的进展,其优势会逐渐显现。
自动化的测试用例能够快速反馈代码的正确性,减少了手动测试的时间,使得开发者能够更加自信地进行重构和添加新功能。
基本上你基于TDD流程添加的代码,对其可靠性心里是很有底的。
不会出现写了很多天代码,一运行到处都崩的情况了。
c、减少长期维护成本
通过TDD开发的代码通常具有更高的稳定性和更低的缺陷率。
这意味着在产品发布后,团队将花费更少的时间在修复bug上,从而可以更专注于新功能的开发。
基于TDD提交测试的代码很少出现一个功能实现的不到位的情况。
bug主要出现在一开始写测试例时就没有考虑到的场景中。
d、促进团队协作
测试用例本身也是对需求的一种文档化,有助于新团队成员更快地理解项目和代码库。
这一点写过的同学应该比较有体会。
因为不同程序员的思路其实差异是很大的。
如果直接去读别人写的代码,理解起来相对会比较困难。
但如果从测试例入手去读代码,因为测试例本身一般模式相对比较固定,起名也带有很强的描述性。
所以我们很容易理解别人代码中每个函数的设计目标。

总之,测试驱动开发是一种强大的开发方法,尤其适用于Flutter这样的现代开发框架。
通过TDD,团队不仅能够提高代码的质量和稳定性,还能在长期内提升开发效率,减少维护成本。
对于追求高质量和高效开发的团队来说,TDD无疑是一个值得投资和采用的策略。
而这也是Flutter相对于原生和很多其它跨平台框架的独门优势。

好了,前面说的都是我们最开始基于哪些原因选择了Flutter,基本都是Flutter的优势所在。
那么接下来说一说这些年使用中发现的Flutter的缺点。

Flutter的一些缺点

诚然,没有任何技术是完美的。Flutter在某些方面也暴露出了局限性,比如:

  • 包体积问题:
    Flutter应用的初始安装包相对较大,对于极度关注应用大小的项目来说,是一个考量点。
    这主要是因为Flutter需要把自身的引擎部分也打包到App中。
  • 第三方库依赖:
    虽然Flutter社区日益壮大,但仍有一些领域,特别是针对特定平台的高级功能,第三方库的支持不如原生丰富或成熟。
  • 学习曲线:
    对于习惯于Java或Swift的开发者而言,学习Dart语言及Flutter框架需要一定时间,初期可能会遇到一定的学习障碍。

总结

综上所述,Flutter在我们团队的六年实践中,不仅证实了其作为跨平台开发框架的巨大潜力,更是在性能、一致性、开发效率和测试支持等方面超出了我们的最初预期。
当然,我们也意识到持续关注其发展,适时调整策略以应对潜在挑战的重要性。
Flutter的旅程还在继续,我们对其未来充满信心。

如果看到这里的同学有学习Flutter的兴趣,欢迎联系老刘,我们互相学习。
点击免费领老刘整理的《Flutter开发手册》,覆盖90%应用开发场景。
可以作为Flutter学习的知识地图。
覆盖90%开发场景的《Flutter开发手册》icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzkxMDMzNTM0Mw==&mid=2247483665&idx=1&sn=56aec9504da3ffad5797e703c12c51f6&chksm=c12c4d11f65bc40767956e534bd4b6fa71cbc2b8f8980294b6db7582672809c966e13cbbed25#rd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3223979.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

imx6ull/linux应用编程学习(15) 移植MQTT客户端库

1. 准备开发环境 确保你的Ubuntu系统已经安装了必要的工具和依赖项。打开终端并运行以下命令: sudo apt update sudo apt install build-essential cmake git2. 获取MQTT库 git clone https://github.com/eclipse/paho.mqtt.c.git cd paho.mqtt.c3. 编译MQTT库 mk…

FullCalendar的使用,react日历组件

1.下载 yarn add fullcalendar/core fullcalendar/react fullcalendar/daygrid 2.运行 import React from react; import FullCalendar from "fullcalendar/react"; import dayGridPlugin from "fullcalendar/daygrid";const ExperimentalSchedule () …

昇思25天学习打卡营第10天|应用实践之基于MindNLP和ChatGLM-6B实现一个聊天应用

基本介绍 今天的应用实践是基于MindSpore和ChatGLM-6B实现一个(伪)聊天应用,本质上就是使用MindSpore下载模型及其权重,然后调用相关API输入自己想说的话,就可以得到回复,如果要打造真正的聊天应用&#xf…

中文大模型基准测评2024上半年报告

中文大模型基准测评2024上半年报告 原创 SuperCLUE CLUE中文语言理解测评基准 2024年07月09日 18:09 浙江 SuperCLUE团队 2024/07 背景 自2023年以来,AI大模型在全球范围内掀起了有史以来规模最大的人工智能浪潮。进入2024年,全球大模型竞争态势日益加…

对比学习和多模态任务

1. 对比学习 对比学习(Contrastive Learning)是一种自监督学习的方法,旨在通过比较数据表示空间中的不同样本来学习有用的特征表示。其核心思想是通过最大化同类样本之间的相似性(或降低它们之间的距离),同…

科普文本分类背后的数学原理——最新版《数学之美》第14、15章读书笔记

新闻分类,或广义上的文本分类,其核心任务是根据文本内容将相似文本聚合在同一类别中。在新闻领域,这意味着将报道划分为财经、体育、军事等不同主题。人类执行此任务时,通过阅读和理解新闻的主旨来进行归类。然而,作者…

第二章 基础知识(4) - 日志记录

在默认日志级别,Blazor项目中默认提供如下日志记录提供程序: 在服务器上(Blazor Server),日志记录仅发生在 LogLevel.Information 或更高级别的 Development 环境中的服务器端 .NET 控制台。 在客户端上(B…

泛微E9开发 控制日期浏览按钮的可选日期范围

控制日期浏览按钮的可选日期范围 1、需求说明2、实现方法3、扩展知识点控制日期浏览按钮的可选日期范围格式参数说明演示 1、需求说明 控制日期浏览按钮的可选日期范围为2024/07/01~2024/07/31,如下图所示 2. 控制日期浏览按钮的可选日期范围在当前时间的前一周~当…

生成多个ssh访问不同git

如果,你的git代码仓库,比如说腾讯云coding,通过ssh秘钥访问,一直用的好好的,有一天,你又增加一个aliyun云效的代码仓库,又配置了aliyun云效的秘钥并且,根据aliyun云效的官方文档上传…

Django 更新数据 save()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFie…

【Linux】多线程_2

文章目录 九、多线程2. 线程的控制 未完待续 九、多线程 2. 线程的控制 主线程退出 等同于 进程退出 等同于 所有线程都退出。为了避免主线程退出,但是新线程并没有执行完自己的任务的问题,主线程同样要跟进程一样等待新线程返回。 pthread_join 函数…

力扣喜刷刷--day1

1.无重复字符的最长子串 知识点:滑动窗口 基本概念 窗口:窗口是一个连续的子序列,可以是固定长度或可变长度。滑动:窗口在数据序列上移动,可以是向左或向右。边界:窗口的起始和结束位置。 应用场景 字符…

基于Python的51job招聘数据采集与可视化项目实践

项目背景与目标 在当今竞争激烈的就业市场中,深入分析招聘信息对于求职者和企业都具有重要意义。基于Python的51job招聘数据采集与可视化项目旨在通过自动化手段高效获取大量招聘信息,并对这些数据进行深度分析和展示。 51job作为中国领先的招聘网站&…

干货:高水平论文写作思路与方法

前言:Hello大家好,我是小哥谈。高水平论文的写作需要扎实的研究基础和严谨的思维方式。同时,良好的写作技巧和时间管理也是成功的关键。本篇文章转载自行业领域专家所写的一篇文章,希望大家阅读后可以能够有所收获。🌈 目录 🚀1.依托事实/证据,通过合理的逻辑,…

【深度学习基础】环境搭建 linux系统下安装pytorch

目录 一、anaconda 安装二、创建pytorch1. 创建pytorch环境:2. 激活环境3. 下载安装pytorch包4. 检查是否安装成功 一、anaconda 安装 具体的安装说明可以参考我的另外一篇文章【环境搭建】Linux报错bash: conda: command not found… 二、创建pytorch 1. 创建py…

C++ 是否变得比 C 更流行了?

每年都会出现一种新的编程语言。创造一种新语言来解决计算机科学中的挑战的诱惑很难抗拒。一些资料表明,目前有多达 2,500 种语言,这并不奇怪! 对于我们嵌入式软件开发人员来说,这个列表并不长。事实上,我们可以用一只…

【Java算法】二分查找 下

🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 一.山脉数组的峰顶索引 题目链接:852.山脉数组的峰顶 ​ 算法原理 这段代码实现了一个查找山峰数组中峰值索引的算法。山峰数组是一个先递增后递减的数组&…

解决安卓tv 蓝牙遥控器配对后输入法弹不出来的问题

t972在蓝牙配对后,自带的LatinIME 输入法会出现弹不出来的现象。 经过分析,主要为蓝牙的kl 文件适配存在问题。解决如下: 1.新建 kl文件Vendor_2b54_Product_1600.kl 放到 /vendor/usr/keylayout/下 内容: #for bl remote add by jason 20240709 key 113 VOLUME_MUTE …

来一场栈的大模拟(主要是单调栈)

一.栈模拟 二.单调栈求最大矩形面积 通常,直方图用于表示离散分布,例如,文本中字符的频率。 现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。 图例右图显示了所描绘直方图的最大对齐矩形。 输入格式 输入包含几个测…

Java内存区域与内存溢出异常(补充)

2.2.5 方法区 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一…