迁移Flutter项目到空安全的血泪史——有血、有泪、有💩
2021年3月4日,Flutter正式发布2.0版本——这一天,我回想起了,被脱发支配的恐怖……发际线再次失守的屈辱……
升级后的错误修复如果升级后打开已有项目,还能够正常通过编译,那么恭喜你,这说明你拥有作为 IT 人的最强技能——强运,且敏捷属性点满自带回避 BUG 和异常的效果 👍
然而其实除非项目规模太小,就没引入几个依赖包,大概率此时会因为依赖冲突或者其他插件包内的错误导致编译失败的 😑 。比如我在做的公司项目,引入了接近 40 个依赖和插件,结果自然是原地爆炸 😒……下面就以我的情况为例,介绍一下几种常见情况的处理方法。
charts_flutter 与 flutter_localizations 冲突我的项目中使用了 charts_flutter 这个库用于图表的显示,升级 SDK 后执行 flutter pub get 安装依赖时第一个报出的错误就是:根据报错信息得知,charts_flutter 这个库指定了其引用的 intl 库版本小于 0.17.0,而更新后 flutter SDK 中引用的 intl 库版本正好就是 0.17.0,所以引发了冲突。碰 ...
记一个由护手霜引发的BUG
现象前段时间,忽然注意到在做的 Flutter 项目的日志收集系统中出现了几个异常的用户,他们的日志中出现了大量错误,报错数量多达几千甚至上万:
而且是同一个错误在一段时间内频繁触发,间隔不过十几毫秒:
其具体的错误堆栈信息为:
123456789101112131415161718192021222324252627│ ⛔ Null check operator used on a null value│ ⛔ #0 _AndroidMotionEventConverter.toAndroidMotionEvent.<anonymous closure> (package:flutter/src/services/platform_views.dart:601)│ ⛔ #1 MappedIterable.elementAt (dart:_internal/iterable.dart:374)│ ⛔ #2 ListIterator.moveNext (dart:_internal/iterable.dart:343)│ ⛔ #3 new ...
qrs_detector——Flutter应用中的心电心率识别
公司的纯 Flutter 应用近期要添加一个根据 BLE 心电设备采集到信息实时显示使用者心率的功能,简单研究后发现需要实现一个 QRS波检测算法,记录下研究和实现的过程。
window.onload = function () {
document.querySelectorAll('.hide_code').forEach(function (div) {
var is = div.querySelectorAll('i');
is[0].click();
});
}
DEMO效果演示
var bili1 = document.querySelector('#bili1');
var container = document.querySelector('#article-container');
bili1.height = (container.clientWidth * 3 / 4) + 'px';
前期调查
由于 App 已经实现了 ...
批量转换图片为webp格式
愈发感受 webp 格式的强大,在博客里大部分用例下使用 webp 可以使图片占用的空间降低一个数量级,所以目前所有的图片资源都要转成 webp 后使用,一个一个转换效率太低,于是写了个脚本,可以批量将本目录下的常见格式图片转换为 webp 格式。
1234567891011121314#!/usr/bin/env bash# 创建备份文件夹mkdir "bak"# 利用ls和正则获取当前目录下的所有图片路径存入数组images=$(ls *.{png,jpg})for image in $imagesdo # -q 90 指定转换质量,经试验这个值效果和压缩率都不错 cwebp $image -q 90 -o ${image%.*}.webp mv $image ./bak/$imagedone
更新(2023-07-04)
下面的脚本可以实现当原始图片尺寸超出指定大小时,自动对其进行缩放
12345678910111213141516171819202122232425262728293031323334#!/usr/bin/env bash# 设置宽高的最大值MAX ...
不满新版深度终端的动画速度,动手修改编译一个版本
作为 Deepin Linux 的老用户,一直重度依赖老王的深度终端,尤其钟爱其系统级别随时可以一个快捷键从屏幕顶端呼出下拉式终端的所谓雷神模式。最近更新了新版终端,给雷神模式的显示加入了一个长得离谱的动画,非常不爽:目前终端的雷神模式动画有点太慢了吧 ,找到源码对应位置之后决定自己编译一个自用
var bili1 = document.querySelector('#bili1');
var container = document.querySelector('#article-container');
bili1.height = (container.clientWidth * 5 / 8) + 'px';
步骤(可选)安装虚拟机
因为不想在日常使用的机器上安装过多无用的开发依赖包,所以使用最新deepin镜像安装了一个全新的虚拟机,具体方法可以参考我之前的这篇建议Linux用户尝试下kvm虚拟机
下载源码新版本终端的源码位置在:linuxdeepin / deepin-terminal
查看当前系统的终端版本:
所以就 clone 这 ...
重译《百恋歌》
一首很喜欢的歌。但是不很满意所有现有的歌词翻译,这么多年了一直心存芥蒂。今次趁着想给博客撸一个歌词显示组件的功夫,终于决定试着自己翻一版 💩
注:点击下面的开关按钮可以控制对应歌词面板的显示与隐藏
.lrc {
height: 5em;
display: flex;
flex-direction: column;
align-items: center;
background: repeating-linear-gradient(45deg, black, transparent 100px);
border-radius: .5em;
}
.lrc_line {
display: block;
line-height: 1rem;
}
.lrc_line:empty:before {
content: "\200b"; // unicode zero widt ...
优雅地管理国际化资源——i18n-manager
项目开发中国际化多语言的需求非常常见,最近这两年工作项目中都是人工手动管理翻译文件的方式,感觉非常麻烦且容易出错。做 Android 开发的时候,Android Studio 中有一个非常好用的 Translations Editor,那么有没有一个类似的通用工具呢?然后,我找到了 i18n-manager 这个项目
使用方法
var bili1 = document.querySelector('#bili1');
var container = document.querySelector('#article-container');
bili1.height = (container.clientWidth * 5 / 8) + 'px';
下载下面是我加入了免费翻译 API 的版本:https://github.com/debuggerx01/i18n-manager/releases/tag/free_translateFeel free ~
这些年,我与Flutter……
2017年12月
为公司规划中的新项目调研跨平台方案可行性,在尝试了包括React Native、 ionic、 Cordova、 Cordova、 Weex 等在内几乎当时所有流行的方案之后,竟没有一个能够让人满意的。直到发现了当时还在 alpha 版的 Flutter,被其优秀的开发体验、精妙的架构设计和惊艳的流畅度表现所折服,于是开始正式研究该框架。
2018年1月
加入了当时(直至今日仍是)人数最多的 Flutter 技术交流群(Flutter 中文用户组 qq:482462550)。
发现当时没有用于将 json 解析生成数据类模板代码的工具,于是在GsonFormat的启发下,用3天时间撸出了JSONFormat4Flutter的第一版,并分享在交流群内供群友使用,获得了最初的好评。
该工具也成为了目前我 GitHub 上 Star 数最多的项目,虽然在易用性上我确实花了一些心思,但是就代码质量而言这就是一坨💩,能够获得这么多的关注更多的是因为当时没有更好的选择,俗话说“来的早不如来的巧”,这个工具就是出现的时机又早又巧,占了大便宜😂
2月
开始尝试编写公司项目 ...
GitLab CI/CD (二) :自动编译部署Web项目
书接上文《GitLab CI/CD (一) :自动打包部署Flutter项目》,这次继续记录用 GitLab CI/CD 自动部署项目中 H5 部分到测试环境的方法。
项目说明这个 H5 的项目主要是作为上篇中 Flutter 项目的补充存在的,因为 APP 中有些页面有复杂图表、动态更新,后续还有可能需要能够方便地分享到主流社交平台进行引流的需求,所以这部分选择用 Web 的方式实现。具体技术选型是 Next.js + TypeScript + Material-UI,通过 Next.js 自带的 Node.js 服务服务器部署,并使用 pm2 做进程管理。
注册 Runner安装方法参考上篇,这次以 shell 作为执行器注册 Runner,如下图:配置方法很简单,只要在输入 executor 时输入 shell 即可,其他选项也都和上篇中的一样。
编写 CI 配置文件配置如下:
12345678910111213141516stages: - deploydeploy_project: stage: deploy variables: GIT_STRATEGY: ...
学院派Academia:赛博已来——控制论革命的残酷真相
针对赛博朋克文化的讨论,大量的解析内容仍然停留在赛博朋克所呈现的五光十色的文化符号和美学表征之上,或仅是浅尝辄止地将赛博朋克视为某种纯粹的“未来幻想”或者“文学体裁”,而无意识地削弱了这个题材的历史性和现实性。这种去深度的、空虚的文化拟像矩阵轰炸,在泛商品化的消费社会,已经模糊了批判文学的焦点,哪怕《赛博朋克2077》这样的作品已经及其有意识地将赛博朋克世界表述为一个不值得向往的反乌托邦,玩家仍然将这个世界看作一个类迪士尼的游乐场,而其中尖锐的深刻性也被暗暗消解了
var bili1 = document.querySelector('#bili1');
var container = document.querySelector('#article-container');
bili1.height = (container.clientWidth * 3 / 4) + 'px';
观看指南为节省您的时间,以及获得更佳的观看体验,建议先阅读以下内容——下面视频主题一节的内容来自视频的开头,如果阅读后对其所述内容感有兴趣,并能接受其学术化的表 ...














