自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 资源 (1)
  • 收藏
  • 关注

原创 上海吃货ing

2026-03-13 11:50:38 16

原创 dio框架查找原始的接口返回值

还有更加难追踪的问题,登录接口直接报错,在上面的地方都没有返回有效的值,在更前面的地方就抛出异常了,可以尝试追踪下面代码,可以看出是框架从数据包的stream里面获取的数据长度超了。上面的banner接口报错,直接返回空数组不可以转成String,只有debug到dio_mixin的487行才可以看到是data返回了空数组导致的框架异常。一般的数据流长度是1448,后端返回了两倍的数据(实际上返回了两次data),导致我们排查了很久。我们在调接口时,有时候dio框架在报错时并不会直接返回接口的原始返回值。

2026-03-12 15:24:32 154

原创 flutter开发小计

3:如何让软键盘顶起输入框,不管是页面还是弹窗dialog,最简单的方法就是最外面包裹scaffold(resizeToAvoidBottomInset设置为true),里面列表外层套一个SingleChildScrollView,如果底部有保存等按钮,需要把按钮放到SingleChildScrollView的column里面,不然按钮也会被输入框顶起来。8:类有更好的默认行为。3:资源释放,养成习惯,把dispose和initstate放在一起,也可以把所有需要释放的资源放到一个固定集合里。

2026-03-02 14:59:27 576

原创 安卓setting.gradle配置-真实代码解析版

首先知道两个概念,插件和项目依赖,插件需要指定仓库,项目依赖也要指定仓库(下载源),插件主要是用于构建项目,比如gradle插件,用于让项目知道如何使用gradle工具,项目依赖则简单,可以使用第三方库里面的各种方法,比如Okhttp等库。说白了,setting.gradle就是把原先根目录的Bulild.gradle中的插件仓库,插件申明,已经项目依赖的仓库转移过来,换个语法罢了,并没有什么新东西。先看老版本的根目录的build.gradle中的项目配置。

2026-02-26 14:36:24 144

原创 安卓setting.gradle配置

安卓之前使用的build.gradle配置,但是在gradle插件7.0版本后推荐使用setting.gradle配置,但是之前的老配置依然生效,只是把老版本里面根目录下Build.gradle中的一些配置放到了setting.gradle中,app下的build.gradle还是一样,语法有些变化先看根目录build.gradle和setting.gradle两者新老版本的变化下面说明插件依赖仓库与项目依赖仓库的区别,以及新老版本的配置方法。

2026-02-26 14:35:12 471

原创 InheritedWidget 共享变量更新记录(填坑版)

InheritedWidget并没有我一开始想的那么牛逼,值一变就会立马通知所有依赖项更新,或者说,它确实可以通知所有依赖性更新,但是有一个被我遗忘的前提,那就是,他自己的build被调用,他才会通知所有依赖项更新,如果只是count++,没有调用setState,ShareDataWidget的build是不够重构的,而且这里面有个细节,ShareDataWidget里面的data是final的,这个问题困扰了很久,现在总算搞清楚了。

2026-02-25 17:55:14 260

原创 服务器集群,负载均衡,CDN简介

一般来说,除了负载均衡和服务器集群,还要同时优化网络带宽限制,数据库集群等,而且负载均衡一般也会是多个,如果一个的话,服务器集群过多的时候处理不过来,单个负载均衡挂掉,整个就会瘫痪。

2026-02-25 17:51:59 221

原创 css样式记录

Class ="func-grid myrace"表示同时拥有func-grid 和myrace两个样式,注意,:class是vue的语法,表示在原先样式基础上增加了一个样式,并且该新增的样式为原先样式的子样式(从代码分析而得,具体待验证)calc是计算函数,var()是取值函数,里面以--开头,navbar-height是状态栏高度。前面定义了一个样式,后面通过:class再附加一个样式,里面可以是动态表达式。如果不希望添加padding时,设置的固定宽度变化,可以加上以下属性。设置超过2行显示...

2026-02-12 10:33:34 339

原创 pwa开发踩坑

pwa应用首次启动时,系统会监听beforeinstallprompt事件,一个生命周期内仅会触发一次,如果已安装,则这个事件不会监听到,能监听到表明尚未安装pwa。2)想要在阅读页或者其他页面触发安装,需要把首页保存的deferredPrompt带过去,只能通过这个对象唤起安装流程。false , 0 ,空字符串,Nan, undefined,null都是假值。2:浏览器安装过一次,需要清除缓存才可以再次检查到安装。假值 || 默认值类似于dart中的?1:触发安装之后拒绝,再点击安装无效。

2026-02-12 10:33:03 187

原创 flutter绘制流程总结

首先从父节点开始一个个遍历处理,先看对应的widget树中和自己相同位置的widget还在不在,在的话把配置更新过来,如果不在的话(widget里面组件删除或者更换了位置),则通过key去查找,之前的widget还存在不,找到的话,当前element就可以修改一下而不是重新创建,最坏的情况就是之前的widget直接找不到了,那这个时候,element就要重新创建。方法1里面主要是进行页面的重构,只要是widget变了,都会把新的widget更新到老的element上,并且构建新的renderObject。

2025-04-23 16:00:30 1095

原创 页面构建源码debug跟踪

如我们所预料,直接走到deactiveChild方法,把原先的Text的element从element树卸载,然后根据新的Single的widget创建新的element,再把新的elemenet挂在到elemenet树上,然后再遍历新的elemenet里面的子组件,继续走updateChild方法(具体流程参考inflateChild),继续走debug,我们猜测,下次updateChild的newChild应该是Text,并且child为空。很明显,newWidget是我们新加的Single…

2025-04-23 15:58:53 686

原创 flutter_框架加载和编译过程深度解析

打开之后可以看到都是flutter依赖的第三方库,以json格式展示(顺嘴一提,这些flutter库都会添加到安卓项目的build.gradle的dependence里面,安卓原生也会依赖对应的安卓库,ios也会依赖对应的ios库,实际上flutter里面任何东西最后都会转换成原生的代码)继续看setting.gradle的最后一行,通过apply语法加载app_plugin_loader.gradle配置文件,前面的路劲是flutter sdk目录,所以我们到flutter sdk目录找到这个文件。

2025-04-23 15:36:15 671

原创 从源码浅析安卓原生如何通过时钟信号通知flutter刷新

首先是SchedulerBinding# ensureFrameCallbacksRegistered方法,然后是SchedulerBinding# _handleDrawFrame à SchedulerBinding#handleDrawFrame àwidgetsBinding#drawFrame (里面调用buildOwner!此处的element是根element à调用element. Element à 调用element的 performRebuild();

2025-04-23 15:34:59 272

原创 flutter中的原生通信介绍(BinaryMessenger和DartMessenger)

可以看到,DartExecutor里面的binaryMessenger本质上又利用了DartMessenger,而这个DartMessenger就是最底层的消息交互的实现类(创建消息队列,通过安卓线程池处理消息,接收flutter端消息,向flutter端发送或者回复消息等)从281行可以看出,进一步调用的是flutterJNI里面的方法,flutterJNI里面封装的都是native方法也就是c/c++代码,所以一般追到flutterJNI方法即可暂停,大体流程就已经清楚了。

2025-04-23 15:29:35 993

原创 flutter插件里的安卓原生代码运行深度解析

简单直白一点讲,刚刚插件的安卓代码里面用到了activity和binaryMessenger(通信大哥,一般存在于flutter引擎中),这两个东西在插件里面是不会凭空产生的,只有我们自己项目的安卓主工程里面才有,再换个说法,我们知道安卓里面一切功能都是以context为基础,查看资源,打开文件,跳转页面都需要有context,插件里面的安卓代码,怎么会凭空有一个context来处理相关的逻辑,比如此处的图片选择插件可以打开系统图片选择窗口。这一步极为重要,是核心代码,也是真正赋予插件灵魂的地方。

2025-04-23 15:26:33 820

原创 flutter开发性能优化

15:熟悉flutter的渲染管线,flutter rebuild ,relayout ,repaint的原理机制,在页面绘制中尤其是动画中,尽量降低局部变化对全局的rebuild,relayout,repaint,这边需要注意,平时只会注意局部rebuild对全局rebuild的影响,其实还要考虑是否引起了不必要的relayout和repaint,rebuild 比较好监听,可以在代码中打断点或者查看。5. 避免更改组件树的结构和组件的类型,树结构改变会导致树重新rebuild。

2024-05-21 11:04:27 1469

原创 flutter 中同步异步以及Future,await和async的深入理解

这是出于安全性考虑,因为await的作用是等待执行,会阻塞后面的代码,如果允许在main队列里面使用,会阻塞主线程,这是系统框架所不允许的,但是异步方法体(event队列)的执行优先级本身就是最低的,因此,可以在异步方法体里面执行await等待操作(反正main里面任务都执行完了,你想等就等吧)首先要知道await的作用是什么,顾名思义,等待,等待前面执行完,获得结果,再执行后面的代码,比如请求网络,获得结果,再渲染页面。所以,async方法体里面如果没有await,那么就没有意义,可以删除该标记。

2023-10-09 12:26:21 1896

原创 flutter系统自适应宽高和ScreenUtils手动适配宽高的原理与区别

因此可以得出结论,当ScreenUtils初始化的时候的宽高和设备的逻辑宽高完全一致的时候,效果是完全一样的,换言之,如果初始化设置的宽高和设备的逻辑宽高不一致,则强制使用初始化设置的宽高为准,这样,不同的手机,都会强制使用screenUtils初始化时设置的宽高作为标准来达成统一。如果使用screenutils,那当前的100就不能当初逻辑像素,需要先转换一次(最终的逻辑宽度=设置的宽度(100)*设备逻辑宽度/ScreenUtils初始化时设置的宽度),然后再乘以设备像素比,最终得到物理像素。

2023-07-25 16:48:21 2073

原创 flutter获取屏幕宽高和某个控件 的宽高

flutter中经常需要获取很多系统宽高或者某个widget的宽高1:手机屏幕的宽高,注意,系统提供两个方法,一个是MediuQuery.of(context).size.width,一个是window.physicalSize.width,这两个是有区别的,第一个是逻辑宽度,第二个是物理宽度,记住公式(物理宽度=逻辑宽度*密度系数),我们开发里面用的宽高基本上都是逻辑宽高,系统会帮我们自动转换成实际宽高2:某个widget的宽高final GlobalKey globalKey = Globa

2022-05-30 11:00:08 9225

原创 安卓/flutter中的逻辑高宽和实际宽高和像素比和手机分辨率之间的关系

众所周知,flutter中获取宽高有两种方法(1)MediaQuery.of(context).size.width(2)window.physicalSize.width其实这两种获取宽高的方法其实是一样的,第一种就是获取的第二种,如下图所示size = window.physicalSize / window.devicePixelRatio,window.physicalSize就是物理像素,也就是一屏宽实际包含的像素点,那后面的window.devicePixelRatio是什么呢?

2022-05-30 10:26:47 2376

原创 关于安卓以及flutter项目迁移报错的各种坑

开发过程中难免会有迁移代码的情况发生,拉取别人的代码或者把自己的代码在另一台电脑上运行,但是一套常规配置下来,会发现结果各种异常报错,在此梳理需要注意的点,以及遇到各种问题需要解决的办法注意点1:尽量保持所有的项目配置一致工具:android studio ,vscode版本保持一致,最好关闭工具的自升级功能,工具升级之后有时会带来奇怪的事情~~jdk,sdk,flutter sdk,版本一致,并且sdk和flutter sdk路径确保一致gradle和gradle插件确保一致,这边也是

2022-04-26 14:51:03 642

原创 安卓滑动事件的冲突解决

子view中处理重写子view里面的dispatchTouchEvent,写上getParent().requestDisallowInterceptTouchEvent(true);即可请求父布局不要拦截事件,并且在onTouchEvent中返回true(不把事件继续往父布局传递)...

2020-04-15 18:39:21 199

原创 android studio git版本控制常规操作

1:使用AS创建本地项目,项目名以美团为例2:紧接着需要进行版本管理,在码云或者gitlab等第三方远程仓库创建项目,(登录网址,注册,创建项目,邀请成员,然后获取项目的.git地址)3:本地项目通过AS与远程仓库关联,大致流程如下参考链接:https://blog.csdn.net/u013184970/article/details/886607224:本地仓库与远程仓库关联之...

2020-04-14 10:57:55 239

原创 关于安卓中的RecyclerView,ListView,ScrollView等控件嵌套之后子控件长度显示不全的问题

RecyclerView和ListView以及ScrollView之间的嵌套是一种比较常见的操作,但是通常会有一个很尴尬的问题,就是,子控件的高度显示不全,比如RecyclerView嵌套ListView,RecyclerView和ListView在xml中高度都设置为wrapContent(想象中的情况是,自适应,listView的高度根据数据全部显示,然后外面的RecyclerView的高度也...

2020-04-10 16:50:12 380

原创 安卓的lambda表达式,刚入门很懵,看懂之后真香的操作

何为lambda表达式,名字的意义不知道,但是在安卓中的用处却是很多的,单反是接口或者匿名内部类的使用都可以用一句话写完,例如如下:getSms.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { }});可以转换成如下写...

2020-04-09 09:41:56 274

原创 安卓答疑系列之私有进程和公有进程以及进程共享,跳转

本文解决安卓开发路程上的疑惑点如下:1:AndroidManifest.xml中的permisson配置,有啥用?原理是怎样的?2:安卓的Uid和Pid的区别3:安卓activity跨进程调用的时候为什么要加android:export,这个属性配置之后究竟干了什么?4:安卓的两个不同的应用之间互相调用总共有几种配置方式?众所周知,Pid是进程ID,Uid是用户ID,只是And...

2020-03-30 15:32:25 412

原创 安卓NDK开发流程(适合新手学习)

为什么需要用到DNK(也就是jni)?因为安卓有很多功能是实现不了的,尤其是和底层硬件交互的一些操作,比如打印操作,直接用安卓连接底层打印机,就很难实现,但是用C就可以和硬件交互,这个时候就需要用安卓去调用C语音的方法,然后C再和底层硬件交互OK,言归正传,看一下NDK的简单开发流程(确保自己可以把NDK操作完整地跑一边,就基本上可以明白DNK的作用了)第一步:下载ndk以及配置ndk路径...

2020-03-16 12:48:57 678

原创 安卓style.xml与attrs.xml的深入解析

首先打开项目的布局文件接着,打开styles.xml,我截取了一段,如图所示:         可以看到里面定义了许多的style,每个style有自己的名字,并且会有父style,不难想象,子style会继承父style的所有的item ,那么重点来了!这里的这么多的item到底是什么鬼??数量如此之多,而且很陌生。其实这里所有的name里面的属性都是安卓定义好的,如

2017-08-30 16:49:57 1209

原创 安卓动画阶段总结

安卓的动画分为三大类,帧动画,补间动画以及属性动画用的最多最常见的是补间动画:分为四个种类,分别是alpha,translate,scale,rotate四种。这类动画的细节适用不再描述,使用方式分为两种,一种是现在xml文件中定义好,然后在java代码中取出使用,demo如下:            android:duration="500"       

2017-08-25 10:38:49 223

原创 关于安卓View中onMeasure的详细分析

先来看一段我的自定义的VIew叫MyViewpublic class MyView extends View {public MyView(Context context) {super(context);// TODO Auto-generated constructor stub}@Overrideprotected void onMeasure(int

2016-12-15 15:09:34 462

安卓 rtmp推流+录屏+远程控制

本应用使用rtmp推流+录屏+instrutation模拟点击实现远程控制操作,由于有跨进程模拟鼠标操作,所以需要root权限,该服务需要适配后台服务器一起使用,安卓中的ip和端口等注意需要根据实际情况修改,最后祝大家爬坑愉快~

2018-07-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除