Flutter error not found dart html

场景:同一个项目,打包成 Flutter web 和 Flutter App。 问题:Error: Not found: ‘dart:html’。 产生上面问题的原因其实就是Flutter web使用了dart:html包的类,而Flutter App没有dart:html相关类。相应的 dart.io 这个包,在 web 中也是不存在。像类似的情况有很多。 要解决上面的问题也很简单。写一个类似 MVC 的调用文件就可以了。Flutter 开发中网络请求使用最多的应该就是 dio 了。我们就以 dio 为例子,写一个调用的实例: dio 初始化的时候需要指定HttpClientAdapter。在app 上为 DefaultHttpClientAdapter web 上为 BrowserHttpClientAdapter,如果全部用DefaultHttpClientAdapter web 端会提示不支持。如果这么写: idWeb? BrowserHttpClientAdapter() else DefaultHttpClientAdapter 就会出现跟上面一样的。 提示 package:dio/adapter_browser.dart not found。 解决: http_client_adapter:用于中间承接转化工具。 http_client_adapter_io.dart:如果是Flutter App就引入这个包 http_client_adapter_web.dart:如果是Flutter web就引入这个包 http_client_adapter: export './http_client_adapter_web.dart' if (dart.library.io) './http_client_adapter_io.dart'; http_client_adapter_io: import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; HttpClientAdapter getHttpClientAdapter() { return DefaultHttpClientAdapter(); } http_client_adapter_web...

四月 20, 2022 · 1 分钟 · LengYue

AndroidStudio新版本Logcat

我一直使用的是预览版的AndroidStudio,今天更新到2021.3.1 Canary 6,发现logcat变样子了。 现在是这个样子了。 嗯,就是这样子,外观到是好看多了,不过对于使用习惯的我们还是需要适应下,过滤还是可以的,就是你要显示自己应用时候不想之前那样可以选择了 需要你 使用正则过滤package:mine,当然你默认安装时候这里就会这样显示了,mine就是当前安装的应用,你也可以指定自己的包名的应用进行过滤。如果你想在增加其他过滤的表达式,增加一个空格在输入就可以,例如过滤Debug可以输入package:mine level:DEBUG 大家可以注意下左边的工具栏,方便我们配置查询日志信息。 一次往下说明下; 清空日志 新版本的Logcat你在日志面板右键没有clear了,只有close,所以点击这个按钮清空吧 自动滑动到日志面板的最新的日志记录位置 自动折行,就是日志一屏展示,超过的折行显示,其实这个感觉没啥用,我不喜欢折行看 第4个比较常用 如图,有几个选项,Standard View 就是默认的展示包含了所有的信息,时间,包名,类名,进程ID等 Compact View 这个模式比较不多,日志值显示时间,日志级别,具体信息 00:53:25.837 W maxLineHeight should not be -1. maxLines:1 lineCount:1 Custom View, 自己配置 5 左边剩下的大家都常用就不说了 希望可以帮助大家。。。。。

三月 22, 2022 · 1 分钟 · LengYue

Typecho to Hugo

这两天正式把博客从 typecho 转到 hugo 了。更准确的说应该是从动态博客转到了静态博客。 以前我是很抵制静态博客的。主要是感觉: 更新麻烦(现在仍然是这种感觉) 放在 github pages 上访问速度也不快,为了加速还需要套个 CDN。(同样是花钱,打折期间买个国内云服务器,速度不慢,还能干其他的) 配置真的很麻烦 这次换到 hugo 的起因是一个域名要备案,博客所在的域名要关闭评论系统,备案完后,打开评论发现,只要有评论的文章就卡死,然后 502。懒得折腾,直接关闭评论功能,发现关了后台也会卡死。索性转移到了 Hugo Hugo 如何安装配置网上很多这里不再赘述,主要说一下我是如何转换的。 部署在哪里 本来打算部署在腾讯对象存储 COS 上的,不过最后还是放弃了。 域名备案,内容审查。 不方便自动化处理,虽然通过github action + 云函数 + hook 可以做到更新仓库后自动构建,下载到 COS 但还是略显麻烦。需要配置好几个地方。 最终选择了部署在 https://vercel.com 国内访问速度开可以。可以关联 github 仓库,不需要自动设置,可以自定义域名,似乎能自动配置 SSL 证书(表现为我设置了域名后访问自动变成 https ,证书是 Let's Encrypt 的免费证书)最后来个测速。 文章迁移 typecho 有个插件,能把文章导出为 markdown 格式,但是导出的文章并不符合 hugo 的要求,hugo 在文章前面可以加很多参数的比如 --- title: "Typecho to Hugo" slug: "typecho-to-hugo" date: 2022-03-11T10:49:59+08:00 categories: [岁月如歌] tags: [Typecho,Hugo] showToc: true TocOpen: true draft: false # description: "Desc Text....

三月 11, 2022 · 1 分钟 · LengYue

GetX Router 设置返回值

通过别名导航: var result = await Get.toNamed(Routes.WEB_VIEW, arguments: { "url": item?.link ?? "", "index": index, "collect": item?.collect ?? false, }); 返回值: Get.back(result: {"collect": collect.value}); 完整代码: () async { /// 导航到新的界面 var result = await Get.toNamed(Routes.WEB_VIEW, arguments: { "url": item?.link ?? "", "index": index, "collect": item?.collect ?? false, }); /// 接收返回值 bool collect = result["collect"]; }

二月 18, 2022 · 1 分钟 · LengYue

Flutter 基础 | Dart 语法 mixin

假设有这样一种场景:小明和小方都是程序员。其中小方会跳舞,当然它们都会编程。 用面向对象的方法可以建模如下: 因为小明和小方都会写编程,为了复用这个行为,提取了超类 Programmer,它包含所有程序员共用的行为 code()。这样一来,Ming 和 Fang 就能复用编程行为,而不是各自重新实现一遍相同的逻辑。(继承复用了行为) 小慧是一个舞者,再用面向对象的方法建模如下: 这样的继承关系违反了 DRY 原则,即 Don’t repeat yourself. 因为小慧并未复用小方的跳舞行为,所以同样的跳舞逻辑出现了两次。 那把跳舞行为上提到它们公共的基类 Human 中,是不是就解决问题了?的确,但这不是强迫所有程序员都必须会跳舞吗。。。 那让小方同时继承 Programmer 和 Dancer 能解决问题吗?能!但多重继承容易出事情,比如 “Diamond Problem”: 假设 Human 类中有 eat() 方法,且 Programmer 和 Dancer 都重写了它,此时 Fang 会发生编译报错。因为它不知道自己的 eat() 方法该采用哪一个父类的实现。上面的类图就好像一个钻石的形状,所以称为Diamond problem。 Dart 禁用了多重继承,而是引入了mixin来解决这个问题。 mixin 是一个特殊的类,它的属性和行为可以被其他类复用,而且不需要通过继承。 语法 如果希望一组属性和行为能够复用于多个类,碰巧这些类不在一条继承链路上,此时就应该使用mixin: mixin DanceMixin { void dance() {} } 这是声明 mixin 的方式,几乎和声明 class 一模一样,就是把 class 换成 mixin 而已。 还可以通过 on 限定 mixin 适用范围:...

二月 10, 2022 · 1 分钟 · LengYue

不使用第三方软件实现Obsidian多平台实时同步

这篇文章涉及服务器配置、docker 技术,当然都是很初级的使用 相信很多人跟我一样,不喜欢使用第三方软件来同步 Obsidian 。每次要打开两个软件,很麻烦。这种情况在手机上最为明显。 这也是我为什么从 9 月多就接触了 Obsidian 但是一没有最为主力的原因。虽然印象笔记已经非常的不好用,但是他的同步真的非常的方便。 直到最近在翻看 Obsidian 的插件的时候接触到了这个插件 Self-hosted LiveSync(虽然也有一款支持 WebDav 的插件,但是试了一下连不上服务器,作者说目前 WebDav 还在测试中)这个插件真的非常的棒 👍🏻。实现了无感同步,甚至可以多平台实时同步。 引用一张作者的图: 搭建服务器端 Self-hosted LiveSync 使用的是CouchDB数据库,这是一个开源的具有版本控制的文档数据库。 你可使用 IBM 提供的 CouchDB 数据库,这里有作者写的教程 https://github.com/vrtmrz/obsidian-livesync/blob/main/docs/setup_cloudant.md 我们这里还是直接自己搭建,我是在家里的群辉 NAS 上搭建的,如果你没有 NAS 也可以在腾讯云、阿里云等云服务上搭建。优先推荐在 NAS 上搭建。 安装 docker 群辉直接再套件商店安装。云服务器用户使用下面的命令 docker version > /dev/null || curl -fsSL get.docker.com | bash service docker restart 安装数据库 首先创建配置文件 local.ini [couchdb] single_node=true [chttpd] require_valid_user = true [chttpd_auth] require_valid_user = true authentication_redirect = /_utils/session....

十二月 24, 2021 · 2 分钟 · LengYue

Android 使用字节码 hook 修复第三发 bug

今天分享一下如何简单方便的实现代码插装~ 修复第三方 bug 事情是这样的,大概在上个月,公司的 Android 项目使用了一个阿里云提供的功能(真就独一份)。因为开发测试机一直是 wifi 情况下使用,完全正常,再快上线前在使用流量的情况下会崩溃。 最后发现是阿里的这个 SDK 使用的网络判断方法还是旧版本的方式(使用了getActiveNetworkInfo,该方法已经废弃),在targetSdkVersion30 的时候回直接崩溃。询问了阿里客服,答复是下周修复,我们肯定是等不到了。(事实是现在也没修复) 如何修复是个问题 上线时间已经确定了,不可能等第三方修复了。只能自己想办法: 比如我们有这么段代码 public class Utils { public static void evil() { int a = 1 / 0; } } 我们项目在打包的时候经历了:.java -> .class -> dex -> apk,假设我们在打包的时候这么做 .java -> .class -> 拿到 Utils.class,修正里面的方法 evil 方法 -> dex -> apk。这个时机,其实构建过程中也给我们提供了,也就是传说的 Transform 阶段。(类似的 arouter、butterknife 都是同样的原理实现代码插装的) 如何修改 Utils.class 呢?可以看看鸿阳大神的 ASM 修改字节码,这样学就对了! 轻量级 aop 框架 lancet 出现 饿了么,很早的时候就开源了一个框架,叫lancet。 这个框架可以支持你,在不懂字节码的情况下,也能够完成对对应方法字节码的修改。 代入到我们刚才的思路: .java -> ....

十一月 9, 2021 · 2 分钟 · LengYue

在 Jetpack Compose 中使用输入框(TextField )遇到的一些问题

在 Jetpack Compose 中使用输入框(TextField )遇到的一些问题 为了更好的阅读体验,在阅读本文之前,你需要对 Compose或者 Flutter (实在太像了)有过基础的了解 Compose 虽然发布已经快一个月了。但是真正用到项目中的应该是少之又少了。靠着以前写 Flutter 积累的少许经验,最近决定试试水,在项目中使用,接下来大概率会更新一些在使用 Compose 遇到的问题 先定一个小目标 日常开发中,类似下面这中搜索功能应该是很常见的需求了,接下来我们就来实现它 TextField 的简单使用 TextField 提供了很多的参数用法,我们先参照 Google 开发文档的基础用法尝试完成以下 UI 给的样式。 稍微了解的同学都知道这个实现起来很简单:row + icon + TextField 完事 还是贴一下简单的代码吧。主要看TextField 部分 var text by remember { mutableStateOf("") } Row( Modifier .fillMaxWidth() .padding(end = 20.dp, start = 10.dp) .background(Color.White), verticalAlignment = Alignment.CenterVertically ) { ···· 省略 ···· TextField( value = text, onValueChange = { text = it onValueChange....

八月 20, 2021 · 4 分钟 · LengYue