当前位置: 首页 > news >正文

flutter是app跨平台最优解吗?

哈喽,我是老刘

最近在知乎上看到这样一个问题

image.png

我们先来解释一下问题中碰到的几个现象的可能原因,然后聊聊跨平台的最优解问题

问题解释

1、跟手、丝滑问题

这个问题其实很多人是有误解的,觉得原生的就丝滑跟手
其实不是这样的
我在做Flutter开发之前,已经做了好几年的Android开发
那时候我日常工作中时不时会出现的一项任务就是优化某个页面的性能
所以即使是原生也经常出现页面卡顿的情况

为什么会这样呢?
其实这和客户端的运行原理有关
在客户端开发中,不管是原生还是Flutter,都会给开发者提供最大程度的可控性
比如如果你实现一个列表页,如果列表中的每一行都只是一行简单的文字
那不管原生还是Flutter,甚至RN、网页都可以很流畅
但是如果你希望随着列表页的上下滑动,其中的每个行都基于它在屏幕中的位置展示不同的颜色、大小等外观
那么就需要列表页每向上或者向下滑动一个像素,都能调用一次你写的代码,来重新根据当前位置计算这一行的大小和颜色等属性
原生和Flutter在如何设置及调用这个处理方法的细节上不同,但是基本流程都是一样的
那么如果你的计算方法很复杂,耗时300ms
就相对于页面每移动一个像素,就要等你的回调运算300ms
用户体验自然就是卡顿,不流畅
而我们开发人员进行性能优化,有很大一部分就是减少这种每一帧的运算耗时

所以很多用户看到的卡顿其实不是平台或者框架的问题,而是开发者有没有优化到位的问题

当然,在某些极端性能要求的场景下,Flutter的性能确实比原生是要差一点的
这种问题随着Impeller引擎的替换,会逐步得到解决
而且这种情况大多数页面里用户是感觉不到的

2、不同页面状态不一致

后面提出的开始下载了下载页面没有显示,以及聊天通知到了但是页面没有看到
我统一归类为不同页面状态不一致问题

我们拿下载功能为例,来看一下这个功能大约是怎么实现的
首先我们要实现一个后台的下载模块
功能是完成文件下载到本地、下载的暂停续传、下载状态维护、下载进度等状态变化对外通知
注意这个功能是完全的后台功能,用户是看不到的

然后我们来实现用户的UI
这里会实现两个和下载相关的页面:
一个是文件列表页,有下载按钮,点击后启动下载
第二个是下载页面,显示正在下载的资源的下载状态,比如下载进度
在第一个页面中,我们点击下载按钮,就会通知下载模块开始一个下载任务

那么具体如何开始下载任务呢
通常是这样的过程
a、调用服务端的接口,根据选择的文件id,获取下载该文件的cdn地址
b、和cdn服务器建立连接
c、开始从cdn服务器下载资源

我们可以看到,从第一步开始就需要网络传输
所以在真正开始下载文件之前,也是有网络传输的,只不过这个数据量不会很大
而且如果下载模块实现的不是很严谨
当文件真正开始下载之前,下载模块没有把这个下载任务添加到正在下载的任务列表中
就会出现前面提到的网络已经在跑但是下载列表中看不到的场景

那么大家觉得这种情况是开发框架的问题还是代码实现的问题呢?

好了,前面的说明只是想告诉大家
很多时候我们看到一个软件的bug或者说缺陷
不一定是软件使用的框架不好,也有可能是软件的实现不太好或者优化不到位
那么接下来我们来说说跨平台的最优解

跨平台的最优解

首先我认为这个是伪命题

有人认为Flutter是跨平台开发的最优解,但这种观点往往忽略了不同应用场景下的具体需求。
事实上,并没有一种“一刀切”的解决方案,每种框架都有其适用的场景和优势。
不同的应用场景对技术的需求是多样化的。
例如,在需要高度动态化的应用场景中,用户无需升级App即可体验新功能,这时React Native(RN)可能因其热更新特性而成为更好的选择。

Flutter的最佳适用场景

那么,哪些场景下Flutter是最佳选择呢?
我觉得是以下两个主要的场景:
1、对性能有较高要求:
Flutter通过编译成原生代码,能够提供接近原生应用的性能。对于那些对响应速度和流畅度有严格要求的应用,如游戏或需要复杂图形渲染的应用,Flutter无疑是一个优秀的选择。
2、对两端一致性有较高要求:
Flutter提供了统一的UI组件库,这有助于开发者在iOS和Android平台上实现一致的用户体验。对于那些追求在不同平台上提供统一界面和体验的应用,Flutter的这一特性显得尤为重要。

特定条件下的最优选择

我们不应该认为Flutter是完美无缺的。
实际上,在满足特定条件的情况下,Flutter可以是目前能找到的最优选择。
这并不是因为Flutter在所有方面都是最好的,而是因为它在特定场景下能够提供最佳的性能、一致性和开发效率。

总结

技术选型是一个需要根据具体情况权衡利弊的过程。
开发者应该深入了解不同技术的优势和局限性,并结合项目的实际需求来做出最合适的决策。
无论是Flutter、React Native还是其他技术,它们都只是在特定条件下的最优选择,而不是放之四海而皆准的解决方案。

如果看到这里的同学有学习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

相关文章:

flutter是app跨平台最优解吗?

哈喽,我是老刘 最近在知乎上看到这样一个问题 我们先来解释一下问题中碰到的几个现象的可能原因,然后聊聊跨平台的最优解问题 问题解释 1、跟手、丝滑问题 这个问题其实很多人是有误解的,觉得原生的就丝滑跟手 其实不是这样的 我在做Flut…...

算法 Hw9

Hw 9 1 Scheduling with profits and deadlines12345 2 Parallel machine1234 1 Scheduling with profits and deadlines 1 决策问题表述: 给定一个利润值 P P P,是否存在一个任务调度方案使得完成所有任务的总利润至少为 P P P 2 在 NP 类中&…...

前端JS必用工具【js-tool-big-box】学习,字符串字母大小写转换的方法使用

这一小节,我们说一下 js-tool-big-box 工具库中,字符串字母大小写转换的使用。请注意:不是说单纯的把字符串转为大写,或者小写。关注 js-tool-big-box 的小伙伴可能知道,我们并没有把一些特别基础的,JS原生…...

Zookeeper:分布式系统中的协调者

Zookeeper:分布式系统中的协调者 前言:引言Zookeeper是什么? 基本概念Zookeeper 数据模型Znode 类型会话Watcher 应用场景分布式锁配置维护组服务名字服务 典型应用场景数据发布/订阅负载均衡命名服务分布式协调/通知集群管理Master选举 工作…...

如何使用代理IP进行数据抓取,PHP爬虫抓取京东商品数据

使用代理IP进行数据抓取通常是为了绕过IP封锁、提高抓取效率或保护你的真实IP地址。在PHP中,你可以使用cURL库来发送HTTP请求,并通过设置cURL选项来使用代理IP。 以下是一个基本的步骤说明,展示如何使用PHP和cURL库结合代理IP来抓取京东商品…...

一口气安装【Python】教程

浏览器搜索python,或者直接跳转网址。 https://www.python.orghttps://www.python.org/ 找到想下载的版本 根据自己电脑下载相应的版本 自定义安装 下一步 修改路径,然后点击安装 等待一会,喝个饮料 点击关闭 安装成功 安装结束...

华为HCIP Datacom H12-821 卷13

1.多选题 以下关于二层漫游和三层漫游的描述,以下说法正确的是? A、如果 STA 漫游时前后关联的 VLAN ID 相同则一定属于二层漫游 B、二层漫游是指客户端在同一子网内漫游 C、三层漫游是指客户端在不同子网间漫游 D、三层漫游前后 STA 关联的 AP 服务集上的 VL AN 必须相…...

基于SSM的酒店客房管理系统

基于SSM的酒店客房管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅获取项目下载方式🍅 链接点击直达:下载…...

【数据结构与算法】最短路径,Floyd算法,Dijkstra算法 详解

Floyd算法 for (int k 0; k < n; k) {for (int i 0; i < n; i) {for (int j 0; j < n; j) {if (d[i][k] ! INF && d[k][j] ! INF) {d[i][j] min(d[i][j], d[i][k] d[k][j]);}}} }Dijkstra算法&#xff08;基于最小堆&#xff09; void dijkstra(int st…...

PHP中如何进行网络爬虫和数据抓取?

随着互联网时代的到来&#xff0c;网络数据的爬取与抓取已成为许多人的日常工作。在支持网页开发的程序语言中&#xff0c;php以其可扩展性和易上手的特点&#xff0c;成为了网络爬虫和数据抓取的热门选项。本文将从以下几个方面介绍php中如何进行网络爬虫和数据抓取。 一、HT…...

【Hadoop集群搭建】实验3:JDK安装及配置、Hadoop本地模式部署及测试

1. 安装 SSH 工具 SSH Secure Shell Client 传输软件 FinalShell(推荐使用) 1.1使用SSH工具将JDK安装包上传至虚拟主机hadoop01, hadoop02, hadoop03&#xff0c;sogou500w 数据上传至 hadoop01。 a. 在虚拟主机/usr 目录下创建文件夹 java&#xff0c;JDK 上传至此目录&…...

分布式锁在Spring Boot应用中的优雅实现

在现代微服务架构中&#xff0c;分布式锁是一种常用的技术手段&#xff0c;用于确保在分布式系统中&#xff0c;同一时间只有一个服务实例能够执行某个特定的操作。这对于防止并发问题、保证数据一致性至关重要。在Spring Boot应用中&#xff0c;我们可以通过自定义注解和切面的…...

常用框架-Spring Boot

常用框架-Spring Boot 1、Spring Boot是什么?2、为什么要使用Spring Boot?3、Spring Boot的核心注解是哪个?它主要由哪几个注解组成的?4、有哪些运行Spring Boot的方式?5、如何理解 Spring Boot 中的Starters?6、有哪些常见的Starters?7、如何在Spring Boot启动的时候运…...

AttributeError: module ‘cv2‘ has no attribute ‘face‘

Traceback (most recent call last): File "D:\AI_37\pythonProject7\day23\课堂代码\day23\07-人脸识别.py", line 4, in <module> recognizer cv2.face.LBPHFaceRecognizer_create() ^^^^^^^^ AttributeError: module cv2 has no at…...

不管你是普本还是双一流,建议你一定要尝试一下学习GIS开发

毕业季&#xff0c;很多企业的秋招和暑期实习已经开始了&#xff0c;在这个24秋招和25考研并列进行的毕业季&#xff0c;GIS专业的同学&#xff0c;做好自己的职业规划显得十分重要。 WebGIS开发&#xff0c;近年来成为了3S及相关专业的学生备受关注的热门选择。 不论是本科毕…...

OurBMC大咖说丨第5期:BMC开发中的非标准化问题探讨

栏目介绍&#xff1a;"OurBMC大咖说" 是由 OurBMC 社区精心策划的线上讲座栏目&#xff0c;邀请 BMC 相关领域大咖共同探讨 BMC 全栈技术的发展趋势、挑战和机遇。无论你是初学者还是资深从业者&#xff0c;"OurBMC大咖说" 都将为你提供一个宝贵的学习和交…...

空调制冷剂泄漏引发健康隐患,冷媒传感器实时监测至关重要

随着夏季的脚步逐渐临近&#xff0c;气温逐渐攀升&#xff0c;空调成为了许多家庭和企业必不可少的降温设备。然而&#xff0c;近年来多起因空调制冷剂泄漏导致的健康问题和安全事故&#xff0c;让人们开始重新审视空调使用安全的重要性。其中&#xff0c;冷媒传感器的实时监测…...

开源TinyFSM状态机适用于嵌入式工业平台吗?

文章目录 引言基于传统 C 实现的状态机TinyFSM 实现的对比现代 C 实现的状态机性能对比TinyFSM 性能测试传统 C 性能测试现代 C 性能测试 工业Misra C编程标准TinyFSM 的优缺点分析结论 引言 TinyFSM是一个为C设计的轻量级有限状态机开源库库。 在嵌入式系统开发中&#xff0c…...

EE trade:利弗莫尔三步建仓法

在股市投资领域&#xff0c;利弗莫尔这个名字代表着无数的智慧和经历。他的三步建仓法成为了投资者们趋之若鹜的学习对象。本文将详细解析利弗莫尔的著名买入法&#xff0c;通过分步进攻方式&#xff0c;有效掌控市场并实现盈利。 一、利弗莫尔的三步建仓法详解 利弗莫尔三步…...

Java中Callable的应用

在Java中&#xff0c;Callable接口是一种用于并发编程的接口&#xff0c;它与Runnable类似&#xff0c;但有一些重要的区别和优势。Callable接口提供了一种在多线程环境下执行任务并返回结果的方法。以下是一些Callable接口的常见应用场景和使用示例&#xff1a; Callable vs.…...

在AutoDL上搞定nuScenes数据集:从解压到mmdetection3d初始化(含避坑指南)

在AutoDL云端高效部署nuScenes数据集&#xff1a;全流程解析与实战避坑指南 nuScenes作为自动驾驶领域最具挑战性的3D感知数据集之一&#xff0c;包含1000个复杂城市场景的多模态数据。但对于刚接触云端GPU服务器的研究者来说&#xff0c;从数据解压到环境配置的每一步都可能遇…...

OpCore Simplify:开源工具驱动的OpenCore EFI高效配置技术方案

OpCore Simplify&#xff1a;开源工具驱动的OpenCore EFI高效配置技术方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题引入&#xff1a;Hacki…...

告别彻夜等待:SteamShutdown让游戏下载完成后自动关机的智能解决方案

告别彻夜等待&#xff1a;SteamShutdown让游戏下载完成后自动关机的智能解决方案 【免费下载链接】SteamShutdown Automatic shutdown after Steam download(s) has finished. 项目地址: https://gitcode.com/gh_mirrors/st/SteamShutdown 你是否也曾经历过这样的困扰&a…...

SUNFLOWER MATCH LAB在CSDN技术社区的分享:从部署到创新的完整旅程

SUNFLOWER MATCH LAB在CSDN技术社区的分享&#xff1a;从部署到创新的完整旅程 最近在CSDN上看到不少关于AI模型部署和应用的讨论&#xff0c;其中SUNFLOWER MATCH LAB这个项目引起了我的注意。它不是一个简单的模型调用工具&#xff0c;更像是一个围绕特定AI能力构建的完整实…...

从Gridworld到吃豆人:用Python拆解强化学习三大核心算法(值迭代、策略调参、Q学习)

从Gridworld到吃豆人&#xff1a;Python实战强化学习三大核心算法 1. 强化学习基础与马尔可夫决策过程 想象一下&#xff0c;你正在训练一只小狗完成障碍赛跑。每次它正确跳过障碍&#xff0c;你会给予零食奖励&#xff1b;如果撞到障碍&#xff0c;则没有任何奖励。经过多次尝…...

宇视NVR接入AS-V1000平台全流程指南(含SDK端口配置避坑)

宇视NVR对接AS-V1000平台实战手册&#xff1a;从配置到排障的深度解析 当监控系统需要整合多品牌设备时&#xff0c;宇视NVR与AS-V1000平台的对接成为典型场景。不同于标准化的协议对接&#xff0c;SDK接入方式往往隐藏着诸多"暗礁"——从端口冲突到能力集匹配&#…...

别再手动复制粘贴了!用CubeMX一键生成FreeRTOS工程(STM32F4 HAL库实战)

告别繁琐配置&#xff1a;STM32CubeMXFreeRTOS全自动工程生成指南 在嵌入式开发领域&#xff0c;时间就是竞争力。传统FreeRTOS移植需要手动复制文件、配置路径、修改中断向量表&#xff0c;稍有不慎就会陷入头文件缺失、链接错误的泥潭。现在&#xff0c;STM32CubeMX的图形化…...

Electron-builder打包Windows应用,我踩过的三个坑(附详细解决方案)

Electron-builder打包Windows应用&#xff1a;三个典型问题的深度解析与实战解决方案 第一次使用electron-builder打包Windows应用时&#xff0c;那种期待与焦虑交织的感觉至今记忆犹新。作为一个从Web前端转向桌面应用开发的程序员&#xff0c;我本以为有了Electron这个跨平台…...

EcomGPT中英文7B模型部署案例:跨境电商运营者如何用一行bash启动AI助手

EcomGPT中英文7B模型部署案例&#xff1a;跨境电商运营者如何用一行bash启动AI助手 1. 项目概述 EcomGPT电商领域智能助手是基于阿里EcomGPT-7B-Multilingual多语言电商大模型开发的Web应用。这个工具专门为电商从业者设计&#xff0c;通过直观的网页界面提供商品分类、属性提…...

OpenClaw人人养虾:密钥管理

Gateway 提供安全的密钥管理&#xff08;Secrets Management&#xff09;功能&#xff0c;用于加密存储 API Key、Token 等敏感凭证&#xff0c;避免在配置文件中暴露明文。为什么需要密钥管理明文风险将 API Key 直接写在配置文件中存在严重安全风险&#xff1a;配置文件可能被…...