- 博客(19)
- 收藏
- 关注
原创 安卓集成unity遇到的问题汇总
从 Windows 导出时,只会复制 Windows il2cpp 可执行文件,而该文件在 OSX 上无法使用。打开build.gradle,搜索unityStreamingAssets去掉。解决方案:打开unity导出的安卓工程将ndkPath注释掉。在将unity导出到安卓工程后,编译报错。原因分析:ndkPath不对。解决方案:需要从同一平台导出。
2025-06-20 16:34:02
186
原创 动态规划概述
动态规划利用记忆化避免重复计算,而分治法会重复计算子问题(例如递归求解斐波那契数列效率极低)。问题的最优解可以由子问题的最优解组合得到(例如最短路径问题)。,并存储子问题的解(避免重复计算),最终组合出原问题的解。:保存子问题的解(通常用数组或哈希表),避免重复计算。找到如何从子问题的解推导出当前问题的解(递推公式)。用递归实现,通过缓存(如哈希表)存储已计算的子问题。最优化问题(最大值、最小值、最长路径等)。:找到子问题与原问题之间的状态转移方程。:将大问题分解为相似的子问题。设置初始状态的值(例如。
2025-06-17 16:39:23
271
原创 ValueKey
当列表数据变化时,Flutter 会比较新旧 Widget 的 Key,若 Key 相同则复用现有 Widget(避免重建,提升性能)。:若列表项无内部状态,且数据变化仅影响显示内容(如纯文本),Key 的收益较小。),Key 匹配能保留其状态(如滚动位置、输入框内容)。:相同 Key 的 Widget 会被复用,减少重建。:即使数据相同,位置变化会导致 Widget 重建。:若列表项永不变化(如固定菜单),无需使用 Key。匹配相同用户,仅更新位置,避免重建 Widget。是 Key 的一种,它通过。
2025-05-09 12:08:27
358
原创 wantKeepAlive
即使它暂时不在可视区域(比如滑动出屏幕),也不会被销毁。当再次回到该 Widget 时,它的状态会被保留,而不是重新初始化。:切换 Tab 时保持每个 Tab 页的状态(避免每次切换时重新加载)。(默认值),Widget 在离开屏幕时会被销毁,再次进入时会重新初始化。:滑动页面时保持之前页面的状态(避免重新渲染)。:对长列表中的某些项保持状态(优化性能)。,比如带有表单、动画或网络请求的页面。等场景,避免不必要的重建,提高性能。是 Flutter 中用于。时,Flutter 会。
2025-04-25 11:50:10
331
原创 Riverpod的响应式原理
基于观察者模式:Provider 是被观察者,Widget 和其他 Provider 是观察者自动依赖跟踪:通过ref.watch自动建立和更新依赖关系精细更新控制:可以选择监听整个对象或对象的特定属性高效传播变更:仅更新受影响的依赖者,避免不必要的重建声明式编程模型:开发者只需声明依赖关系,框架处理更新传播Riverpod 的这种响应式设计使得状态管理变得直观且高效,同时保持了良好的可维护性和测试性。
2025-04-24 11:41:48
920
原创 Dart中GlobalKey的具体应用实例
GlobalKey在Flutter中是一个强大的工具,它允许开发者从应用的不同部分访问特定widget的状态或与widget交互。
2025-04-23 12:03:46
274
原创 Widgets,renderObjects,Elements的关系
在 Flutter 中,和是三个核心类,它们共同协作来完成 UI 的构建、更新和渲染。
2025-04-18 10:28:33
708
原创 Widget、State、Context 概念
Widget 是 Flutter 应用的构建块,用于描述用户界面的不可变配置。它们类似于“蓝图”,定义了 UI 的布局和样式,但本身并不直接绘制到屏幕上。
2025-04-17 11:34:46
833
原创 Stateful Widget 生命周期
在 Flutter 中,的生命周期指的是一个 Stateful Widget 和其状态对象(State)在应用中从创建到销毁的完整过程。理解这一过程对于构建动态和高效的 Flutter 应用至关重要。State下面是。
2025-01-02 15:57:49
372
原创 一次卡顿优化
如果在16ms内,主线程进行了耗时操作,CPU和GPU没有来得及生产出一帧缓冲,那么这一帧会被丢弃,显示器就会保持不变,继续显示上一帧内容,用户的视觉上就出现了卡顿;项目里用了组件化,故hook了imageNamed,查找相应组件的bundle,然后调YYImage的解码方式在主线程解码图片,这里的问题是在反复滑动过程中,会反复的查找bundle - 解码, 较为耗时。整个页面都是通过TableCell实现的,对于顶部的轮播卡,快捷入口等只展示一次的卡片在上下滑动过程中仍会reload,显然是多余的。
2024-12-30 15:51:52
790
原创 VS Code Flutter常用快捷键
Ctrl + Alt + - Ctrl + pgUp / pgDn Ctrl + Tab Ctrl+ Up Arrow/Down Arrow Alt + Page Up/Alt + Page Down Ctrl + Home/ Ctrl + End Ctrl + Shift + O Ctrl + Shift + P
2024-12-30 15:18:03
254
原创 仓库Git瘦身
随着时间的推移,Git存储库变得越来越大。个人电脑硬盘空间有限,仓库较多时,占用了大量存储空间。由于每个人都必须下载文件,因此获取代码库的速度变慢。它们占用服务器上的大量存储空间。会达到Git仓库的存储限制。重写存储库会删除不需要的历史记录,从而使存储库更小。git filter-repo是用于快速重写Git存储库历史记录的工具。注意:重写存储库历史记录是一种破坏性操作。在开始之前,请确保备份您的存储库。备份存储库的最佳方法是导出项目。
2024-12-27 18:42:35
1051
原创 Git不常用解决方案
git merge 会生成一个新得合并节点,而rebase不会.如两个分支:test 和 master使用git pull时默认是merge, 加 –rebase参数使其使用rebase方式。
2024-12-25 18:07:41
234
原创 Completer的用法
在 Flutter 和 Dart 中,Completer是一个用于手动控制Future对象的类。它允许你在未来的某个时间点完成一个异步操作,并且可以在异步操作完成时提供结果或错误。Completer通常用于需要手动完成Future的场景,例如在事件驱动的编程中。Completer。
2024-12-24 14:23:22
587
原创 Git常用命令
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致。重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变。重置暂存区的指定文件,与上一次commit保持一致,但工作区不变。显示某个commit之后的所有变动,每个commit占据一行。显示commit历史,以及每次commit发生变更的文件。重做上一次commit,并包括指定文件的新变化。
2024-12-23 17:24:34
1063
原创 二进制重排
而如果启动链路上的方法分散在不同的页的话,整个启动的过程就会产生非常多的 Page In 操作。Link Map 是编译期间产生的产物 , ( ld 的读取二进制文件顺序默认是按照 Compile Sources - GUI 里的顺序 ) , 它记录了二进制文件的布局 . 通过设置 Write Link Map File 来设置输出与否 , 默认是 no ,在编译完成后通过验证 LinkMap 文件中 #Symbols: 部分符号顺序是否和 order 文件中的符号顺序一致来确定是否配置成功。
2024-12-23 12:05:55
982
原创 App启动优化
除了第一次装包会显示倒计时启动页,之后每次启动都会显示一个默认启动页,和该默认启动页并发展示的是最终要展示的社区首页,因为社区首页需要网络请求加载数据,之前的方案为了每次冷启后不先展示一片空白影响用户体验,故先展示一个1s的默认启动页.为了能减少系统因缺页中断产生的 Page In 操作,我们需要做的就是把启动链路上所有用到的方法都排在连续的页上,这样系统在加载符号的时候就可以减少相应的内存页数量的访问,从而减少整个启动过程的耗时。动态库载入过程,会去装载app使用的动态库。
2024-12-23 11:40:56
610
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人