Flutter主题切换——让你的APP也能一键换肤

为了让你的 App 更美观,主题切换已经是一个必不可少的功能了,但如果想在传统的 Android 和 iOS 上分别适配不同的主题相当繁琐。但这一切,在 Flutter 中都非常容易实现。今天我们就来看看,如何在 Flutter 中给你的 App 添加换肤功能。我们要实现的效果如下: 添加依赖 在该案例中,我使用到了 provider 和 flustars 两个库,简单介绍一下这两个库: provider 官方推荐的状态管理库,相比其他状态管理库使用起来比较方便。 状态管理:通俗的讲,当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/Widget)中的多个子组件之间共享状态(数据),这个时候我们就可以用 Flutter 中的状态管理来管理统一的状态(数据),实现不同组件直接的传值和数据共享。 flustars 号称“Flutter 全网最全常用工具类”,其中包括了SpUtil、ScreenUtil、TimelineUtil等常见工具类,这里我们要使用的是SpUtil这个部分,用于存储用户所选择的主题信息。 以上就是关于我们使用的两个第三方库的介绍,如果想要使用,我们需要在pubspec.yaml文件中添加如下内容: provider:^4.0.5flustars:^0.2.6+1准备工作做好了,接下来我们就开始编码吧。 添加主题样式 我们需要先想好自己所需要切换的主题样式列表,如果觉得麻烦的可以直接用下面的内容: Map<String, Color> themeColorMap = { 'gray': Colors.grey, 'blue': Colors.blue, 'blueAccent': Colors.blueAccent, 'cyan': Colors.cyan, 'deepPurple': Colors.purple, 'deepPurpleAccent': Colors.deepPurpleAccent, 'deepOrange': Colors.orange, 'green': Colors.green, 'indigo': Colors.indigo, 'indigoAccent': Colors.indigoAccent, 'orange': Colors.orange, 'purple': Colors.purple, 'pink': Colors.pink, 'red': Colors.red, 'teal': Colors.teal, 'black': Colors....

plainify

Flutter实现文件下载

前言 之前有做一个工具集的微信小程序「开挂 Lite」,但是由于小程序自身限制,没有办法实现下载文件的功能,只能把下载链接解析出来。而且受限于微信平台,小程序的审核是一件很麻烦的事情,因此有了将其 APP 化的想法。 自从去年 Flutter 横空出世后,我便一直关注它的发展,时隔一年后重新拾起,发现它的生态已经初具规模,于是决定采用 Flutter 重做一个「开挂 Lite」。后期我也会不定时更新一些和 Flutter 有关的文章,希望大家可以多多支持。本文记录的便是我利用 Flutter 实现文件下载功能的过程。 完整源码可在公众号:「01 二进制」后台回复:「Flutter 文件下载」获取 开始 我们先看一下实现的效果: iOS Android 本 demo 的实现效果非常简单,就是点击一个按钮,然后下载文件,完成后提示用户是否打开文件。 准备工作 在本 demo 中使用的 IDE 为 Android Studio,同时使用到了以下几个库: flutter_downloader: ^1.1.7 path_provider: 1.1.2 permission_handler: ^3.1.0 progress_dialog: ^1.1.0+1 toast: ^0.1.4 我们先新建一个空项目,然后将上述依赖添加到项目的pubspec.yaml文件,添加位置如下: 接下来我们可以在 Terminal 中输入flutter packages get或者点击 IDE 左上角的Packages get字样安装依赖。 然后将初始项目中的多余代码删除,并在中间添加一个按钮。 body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ RaisedButton( child: Text("点我下载文件"), onPressed: () { // 执行下载操作 _doDownloadOperation(); }, ), ], ), ), 其中_doDownloadOperation()便是我们执行下载操作的方法,至此,前期准备工作结束。...

Flutter数据存储之shared_preferences

前言 做过android开发的人都知道,可以利用SharedPreferences这个轻量级的存储类来保存键值对信息,在Flutter中,我们可以使用shared_preferences库来同时支持Android和ios平台。 参考: 《Flutter中的本地存储》 《Flutter知识点:数据存储之SharedPreferences》 shared_preferences 0.4.2 使用介绍 在pubspec.yaml文件中添加依赖 shared_preferences: "^0.4.2" 添加的位置如图所示: ...

HashMap的排序

前言 HashMap 在 Java 里面是一种非常实用的工具,他清楚明白的反映了**“键-值”**之间的关系,HashMap 本身是无序的,但是 HashMap 的排序却是一个比较常见的问题,这里针对 HashMap 的两种排序方式做了笔记。 import java.util.*; class Main { public static void main(String[] args) { Map<Integer, String> map1 = new HashMap<>(); map1.put(3, "三"); map1.put(6, "六"); map1.put(1, "一"); Map<String, Integer> map2 = new HashMap<>(); map2.put("三", 3); map2.put("一", 1); map2.put("六", 6); sortByKey(map1); sortByValue(map2); } // 按照键排序 static void sortByKey(Map map) { Object[] objects = map.keySet().toArray(); Arrays.sort(objects); for (int i = 0; i < objects.length; i++) { System....

plainify

IP 地址怎么定位?

我们经常可以在影视作品中见到某某组织通过对某个人的 IP 地址进行监控,定位其位置,甚至精确到某栋大楼的某一层,如此可怕的场景在现实生活中真的有可能会发生吗? 先来说结果,仅通过 IP 地址最精确能够达到街道级别。而且在不通过运营商的用户数据库查询情况下,定位到家庭住址和单元楼的情况难度很高。 ISP 在《互联网是如何工作的》一文中,我们介绍道,IP 地址是类似于现实世界中的地址这样的东西,通过 IP 地址,我们就可以在网络上定位到一台计算机,在现实世界中,IP 地址是由一个叫互联网服务提供商,即 ISP 提供的。 回想一下我们上网的过程: 去运营商(移动、电信、联通)办理宽带业务 -> 业务员上门拉线 -> 电脑连接宽带 -> 访问互联网 在这一过程中,三大运营商就是我们能接触到的 ISP 的,ISP 可以从互联网管理机构申请到很多 IP 地址,然后一些机构和个人从某个 ISP 获取 IP 地址的使用权,并可通过该 ISP 连接到互联网。 那么 ISP 又是如何标记 IP 地址的地理位置的呢? 我们先来说说 ISP 的三层结构。 三层 ISP 结构分为主干 ISP,地区 ISP,本地 ISP。本地 ISP 给用户提供最直接的服务,本地 ISP 可以连接到地区 ISP,也可以连接到主干 ISP。从原理上讲。只要每一个本地 ISP 都安装了路由器连接到某个地区 ISP,而每一个地区 ISP 也有路由器连接到主干 ISP,那么在这些相互连接的 ISP 的共同作用下,就可以完成互联网中的所有的分组转发任务。 这里我们通过计算机网络教材中的一张图来理解三层结构,如图 1 所示 👇 也就是说,当你向好友发了一条微信,这条微信首先会从你所在公司/学校的内网上发到当地的服务器,再从当地服务器发送到地区服务器,之后从地区服务器通过移动/联通/电信的服务器向你好友所在地的地区服务器转发,再通过本地服务器最终转发到好友所在公司/学校的内网。 如此一来,既然你的 IP 地址是由当地的 ISP 分配给你的,自然也就知道了你所在的 IP 地址的大致位置了。...

ISE头条号海报生成器

完整源码可在公众号:「01二进制」后台回复:「海报生成器」获取 最近自闭了一段时间,仔细思考一番后还是决定要把自己心中所想坚持下去。今天来分享一个日常生活中经常见到,但是制作起来又可能会一时没有思路的东西,主要功能就是生成带二维码的卡片或者海报。 之前莫名其妙的被导师安排负责管理实验室的头条号,任务不难,就是接收实验室学长学姐翻译转述的论文,然后再发布到今日头条的头条号上,最后再生成如下所示的宣传图即可: 当时觉得,不就是发发文章,然后再用ps做个图这么简单吗。可接手之后才发现我毕竟图样图森破啊,从去年11月我开始发文章到今天,期间从未有一天断过,但是这头条号的编辑器也从未更新过,一个这么大的自媒体企业,文章的编辑器竟然烂的跟坨💩一样,不支持外部图片,不支持markdown,不支持数学公式,不支持多级标题。(别跟我说什么可以把markdown转成html然后再复制进头条号的编辑器里面,样式都变成鬼了) 扯远了扯远了,回到正题。之前这么多天实现上述需要的主要流程如下: (采取各种方式优化排版)把文章发布到(不支持各种常用功能的)头条号上 文章发布后,获取其文章链接,并到草料二维码生成器网站,上传实验室logo后生成二维码下载至本地 利用PhotoShop将封面图、文章标题和文章二维码合成在一起后发给老师。 在经历了100天上述这样重复的操作之后,我厌烦了。难道就没有一个工具可以让我只输入文章链接和标题就自动生成海报的吗? 苦苦寻觅半天无果,也罢,有条件要上,没条件创造条件也要上。没有现成的轮子,那就只能自己打造一个了,Python无疑是开发这个小工具的首选。 一般用于推广的海报或卡片样式都差不多,需要改变的主要就是二维码,所以只需要准备好海报的背景图,然后根据用户提供的二维码,将其贴在海报指定的位置上即可。 此次实验的项目结构如下: assets文件夹中包含一些资源文件,例如msyhl.ttc(字体文件)、template.jpg(背景模版图片)。output是生成的海报存放的路径 生成带logo的二维码 本次生成二维码依赖于 PIL 模块和 qrcode 库,官方地址为:https://pypi.org/project/qrcode/5.1/,这里不解释用法,感兴趣的自己去官方文档下了解。这里就直接上代码了,具体代码的用意详见注释: # 生成一个带logo的二维码 def generateQRCode(url): # 初始化 qr = qrcode.QRCode( version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8) # 添加内容 qr.add_data(url) qr.make(fit=True) img = qr.make_image() img = img.convert("RGBA") # 读取logo icon = Image.open("assets/logo.jpg") # 设置logo img_w, img_h = img.size factor = 4 size_w = int(img_w / factor) size_h = int(img_h / factor) icon_w, icon_h = icon....

Java 中链表与数组间的相互转换

自定义链表 ListNode 类 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } 将链表转换成数组 //将链表转换成数组 public class Test1 { public static void main(String[] args) { Test1 test1 = new Test1(); int[] a = {1, 9, 9, 9, 9, 9, 9, 9, 9, 9}; ListNode l1 = test1.arrayToListNode(a); test1.printListNode(l1); } //数组转换成链表 public ListNode arrayToListNode(int[] s) { ListNode root = new ListNode(s[0]);//生成链表的根节点,并将数组的第一个元素的值赋给链表的根节点 ListNode other = root;//生成另一个节点,并让other指向root节点,other在此作为一个临时变量,相当于指针 for (int i = 1; i < s.length; i++) {//由于已给root赋值,所以i从1开始 ListNode temp = new ListNode(s[i]);//每循环一次生成一个新的节点,并给当前节点赋值 other.next = temp;//将other的下一个节点指向生成的新的节点 other = temp;//将other指向最后一个节点(other的下一个节点) other=other.getNext(); } return root; } /** * 遍历一个链表 */ public void printListNode(ListNode l) { while (l != null) { System.out.print(l.val + " "); l = l.next; } } } ...

257 words 2 min

Java 并查集的实现

概念 其实并查集顾名思义就是有“合并集合”和“查找集合中的元素”两种操作的关于数据结构的一种算法。 用途 维护无向图的连通性。支持判断两个点是否在同一连通块内。 判断增加一条边是否会产生环:用在求解最小生成树的Kruskal算法里。 操作 并查集主要就三个操作:初始化、合并、查找 初始化 一般来说,并查集的初始化用数组即可,例如数组Tree[i],i表示某节点,tree[i]表示当前节点的根节点 查找函数 这里的查找和java集合类List中的查找函数get()并不一样,他的作用是查找该节点的根节点,如果集合的parent等于集合的编号(即还没有被合并或者没有同类),那么自然返回自身编号。如果不同那么就可以调用递归函数。 代码如下 // 并查集查找根节点 static int findRoot(int x, int[] arr) { // 如果集合i的父亲是自己,说明自己就是源头,返回自己的标号 if (arr[x] == -1) return x; else // 否则查找集合i的父亲的源头 return findRoot(arr[x], arr); } 若需要在查找过程中添加路径压缩的优化,我们修改上面这个函数为: // 并查集查找根节点(优化算法,本质是将路径压缩了) static int findRootUseful(int x, int[] arr) { int res = 0; if (arr[x] == -1) return x; else { res = findRoot(arr[x], arr); arr[x] = res; // 将当前结点的双亲结点设置为查找返回的根结点编号 return res; } } ...

Java中的进制转换

近期刷题时遇到了进制转换,在这整理一波 方法: 十进制转其他进制 Integer.toHexString(int i);//转成16进制 Integer.toBinaryString(int i);//转成二进制 Integer.toOctalString(int i);//转成8进制 Integer.toString(int i, int radix);//转成任意进制,radix不在【2,36】区间内radix=10 Long.toHexString(long i);//转成16进制 Long.toBinaryString(long i);//转成二进制 Long.toOctalString(long i);//转成8进制 Long.toString(long i, int radix);//转成任意进制,radix不在【2,36】区间内radix=10 其他进制转十进制 Integer.valueOf(String s, int radix); 返回值类型为Integer,radix不在【2,36】区间内,抛出NumberFormatException异常 parseInt(String s, int radix); 返回值类型为:int,radix不在【2,36】区间内,抛出NumberFormatException异常 各进制间的转换 Integer.toString(parseInt(String s, int srcRadix), int destRadix);

Java中计算两个日期间隔多少天

String dbtime1 = "2017-02-23"; //第二个日期 String dbtime2 = "2017-02-22"; //第一个日期 //算两个日期间隔多少天 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = format.parse(dbtime1); Date date2 = format.parse(dbtime2); int a = (int) ((date1.getTime() - date2.getTime()) / (1000*3600*24)); 直接通过计算两个日期的毫秒数,他们的差除以一天的毫秒数,即可得到想要的两个日期相差的天数。

34 words 1 min