Flutter七日游第六天:2018-12-21 天气:雨-阴
零、前言
对于问我怎么学习的人,空口白牙说的是鸡汤,我不喜欢喝也不喜欢做。
文中根据实际情况,分享一些个人的编程心得,自己参考一下,取长补短
一、单线程模型下的异步操作
- 为什么强调是
单线程
:Dart是单线程模型,单线程模型,单线程模型!!!什么是单线程:
就是你是一个人在战斗
什么是异步: 比如你要烧水(耗时操作),并不需要傻傻地等着水开才能去做下一件事(扫地)
只要开火(方法调用),然后你就可以去扫地(执行异步任务下面的方法),水烧开鸣叫(回调), 去冲水(处理异步任务结果)。
- Dart异步编程的方式:Future和Stream
Future相当于40米大砍刀,Stream相当于一捆40米大砍刀
dart提供了关键字async(异步)
和await(延迟执行)
,相当于普通的便捷的小匕首
1.async
和await
的简单使用
感觉网上一些教程上来就告诉你什么样是错的,然后一步步纠正…最后都没有完整代码总结一下
我想最起码应该先给个正确的示范吧…然后再说错误情况
1.1:最简单的文件读取
1 | //根据名称读取文件 |
函数执行过程中看到了
async
(烧水)会先去执行下面的操作(扫地),水烧开await
放行,print(result);
(冲水)
1.2.async
和await
的分析
也许你就问,不加async或await会怎么样?不同时加又会怎么样?
不加async或await
:就像平常代码一样顺序执行加async不加await
:然并卵不加async加await
:报错
2.去拿我40米大砍刀:Future
可以看出:
file.readAsString()
返回的是:Future<String>
,
1 | main() { |
这样操作也能达到异步的效果,具体就不深入说了
有时间打算写一篇:基于Java
,Python
,JavaScript(ES6+)
,Dart
,node
(都是我曾涉及过的)
综合讨论一下单线程,多线程,同步,异步
,毕竟这几个词让我挺烦心
二、Dart中的IO操作
1.文件操作的API测试构造函数
1 | File(文件路径) |
[番外]:如何去认识一个类:Uri为例
也许看到
File.fromUri(Uri uri)
你会说Uri我不会,然后就不管了,如果有空就看两眼呗,又不会吃亏
我的经验是先看它的构造方法,然后再看字段,再总览一下方法名(Ctr+F12)
如果你对这个类一无所知,还是先看粗略瞄一下文档注释,至少知道干嘛的
一般都会有一句简洁的话介绍它(英文不会,词典查一下,读原文档:这道坎早晚要过的)
Android中对Uri有一定的认识,知道它是一个资源定位的标志,就像门牌号吧。
1 | ---->[注释第一句]------------ |
不知道的东西去试试呗,反正跑一下又不要钱
1 | var base = Uri.base; |
如果用File开一个网络的Uri会怎么样:
学会分析bug
,不要轻易否定
首先保证网址是正确的
1 | var file = File.fromUri(new Uri.http("192.168.43.60:8089", "/file/springboot/data.json")); |
也许你到走了,会想(当然我也是这样):什么鬼,老子看半天,TM不能用,浪费时间!
也许你会愤然而去,而我则会去分析错误的原因(这就是面对错误的不同选择)
前者可能永远也不知道原因,而后者即使最后无果,路上也会有所收获(打字的现在,我还未去分析)
所以,一起去看看吧
1 | ---->[bug的链接处:] |
file的Uri是什么鬼?
也许你不知道,文件拖到浏览器里,也是能打开的,你所见的就是feil类型的Uri
1 | //源码上面还有很多注释自己看.... |
1 | 然后你就会用File.fromUri了: |
从一个小的API开始,让自己尽可能去多认识一些事物,并不是说你要把源码都理得很清楚
在自己接受范围的150%之内可以去尝试,失败了没有关系,总比看那些驳来驳去的文章有意义
如果你想提高自己(这句话也是自勉):
不要让自己总走在平坦的路上,有时登高望远方能窥见美景,也不要一心只走险峰,小心失足。
今天心情不佳,废话有点多,听得进去的就听,听不进去的就无视,如果要驳我,请在评论区!!
[番外结束]
2.File和Directory的常见Api
Java里文件夹也是File对象,Dart里区分了出来
很有意思,File和Directory的Api基本上都是同步,异步成对出现
2.1:递归创建文件夹
默认recursive是false,只能创建下一级
1 | main() { |
2.2:列出所有的文件
1 | main() async { |
1 | main() async { |
目录下所有文件都列出来,就不贴图了
2.3:重命名
看一下就行了
1 | var dir = Directory(r"C:\Users\Administrator\Desktop\dart\test\all\li"); |
3.File对象的常用操作:
1 | //根据名称读取文件 |
另外还有几种不同的打开方式,基本上Java都包含了,看名字也知道是什么
4.文件的写入:
和java一样,默认全换:想要追加:参数加
mode: FileMode.append
1 | main() async { |
三、关于移动端的文件读取问题
1.路径问题
path_provider: ^0.4.1
:提供了三个路径,勉强用用吧
1 | localPath() async { |
2.动态权限申请问题
simple_permissions: ^0.1.9
:提供了动态权限申请
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
1 | readFormSD() async { |
好了,这样知识就对接完毕
3.小测试:列出sd卡的文件
比较基础,就是读取文件夹下的内容,设置给ListView的Item
1 | import 'package:flutter/cupertino.dart'; |
三、Dart中的网络请求操作:
0.添加依赖:在pubspec.yaml的dependencies下
1 | http: ^0.11.3+17 |
我的服务器上提供了一些网络请求的Api,如果你想自己搭建服务器接口,请看这篇
来回顾一下接口的api:
1 | 查询接口:GET请求-------------------------------------------- |
1.get请求
注:
client
你随便取什么名字都行,客户端访问服务端,所以我用client
1 | import 'package:http/http.dart' as client; |
如果你觉得回调有点low,也完全可以用Future(用什么不是重点,怎么简洁怎么来)
1 | main() { |
2.post请求:插入数据
1 | main() { |
3.put请求:更新数据
1 | main() { |
4.delete请求:删除操作
1 | main() { |
四、关于Json
一般都是解析服务器端传来的json,非后端基本不用生产json
1.将json转化为对象
1 | { |
1.1:创建实体类,创建构造方法
1 | class NoteBean { |
1 | var j = |
2.复对的Json转化(也就是Json里套Json)
2.1:待处理的Json字符串
1 | { |
2.2:增加实体类ResultBean
1 | class ResultBean { |
2.3:使用:
1 | var j = |
3.关于Json的内嵌数组
这里data是一个json的数组,这样访问的服务端接口的数据处理就搞定了
1 | { |
1 | class ResultBean { |
1 | var j ='{"code":200,"msg":"操作成功","data":[{"id":198,"type":"绘图相关","name":"","localPath":"---","jianshuUrl":"","juejinUrl":"---","imgUrl":"http://toly1994.com:8089/imgs/android/8a11d27d58f4c1fa4488cf39fdf68e76.png","createTime":"2021-02-18","info":"hh","area":"A"},{"id":200,"type":"绘图相关","name":"","localPath":"---","jianshuUrl":"","juejinUrl":"---","imgUrl":"http://toly1994.com:8089/imgs/android/8a11d27d58f4c1fa4488cf39fdf68e76.png","createTime":"2018-12-21","info":"hh","area":"A"}]}'; |
好了,今天就到这里,明天最后一天,敬请期待