Dart 相关语法笔记

1. 级联操作符

		//常规操作
    var paint = new Paint();
    paint.strokeCap = StrokeCap.butt;
    paint.strokeWidth = 1;
    paint.style = PaintingStyle.fill;
    //级联操作符
    var paint1 = new Paint();
    paint1..strokeCap = StrokeCap.butt
    ..strokeWidth = 1
    ..style = PaintingStyle.fill;

2.引用库冲突

2.1 as 关键字

同一个函数处于两个包中,同时我们都引用了这两个包,类似下面这样:

---->[utils/color_utils.dart]----
sin(double d){
}

---->[main.dart:5]----
import 'package:toly/utils/color_utils.dart';
import 'dart:math';
void main() {
  sin(5);
}

---->[解决方案]----
import 'package:toly/utils/color_utils.dart' as myMath;
import 'dart:math';

void main() {
  myMath.sin(5);
}


我们可以使用as关键字为我们自定义的重命名…

2.2 控制显隐部分导入

dart中支持引入的包中被隐藏的对象无法被外界访问

import 'package:toly/utils/color_utils.dart' show sin;//只显示sin函数
import 'package:toly/utils/color_utils.dart' hide sin;//只隐藏sin函数

2.3 权限访问控制

dart中没有private、protect、public等修饰符。默认的都是可以被访问的。那么是怎样控制权限访问的呢?

Dart中规定,名称前加下划线‘_’可以限制外部的访问,方法名、文件名、变量等均可

3. 异步

Dart 是一个单线程的语言,遇到有延迟的操作(IO/网络请求)时,线程中按照顺序执行的运算就会阻塞,UI卡顿甚至AAR,在Dart中我们可以将它放到延迟运算的队列中

3.1 async和await

  //HTTP的get请求返回值为Future<String>类型,即其返回值未来是一个String类型的值
  getData() async {    //async关键字声明该函数内部有代码需要延迟执行
    return await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"}); //await关键字声明运算为延迟执行,然后return运算结果
  }

⚠️注意:这里retrun的并不是我们想要的数据结构类型,他的返回类型时一个await延迟执行的结果。在Dart中,有await标记的运算,其返回结构都是一个Future对象,所以我们可以这样写:

String data;
getData() async {
  data = await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"});     //延迟执行后赋值给data
}

⚠️:

  • await关键字必须在async函数内部使用
  • 调用async函数必须使用await关键字

3.2 Future

上面我们提到了Future,那么什么是Future?

Dart是基于单线程模型的语言。在Dart中也有自己的进程机制 – isolate。APP的启动入口main函数就是一个 ioslate,Dart中的ioslate之间无法直接共享内存,不同ioslate之间只能通过ioslate api进行通信。

Dart线程中有一个消息循环机制(event loop)和两个队列(event queue和microtask queue)

  • event queue 事件队列 包含所有外来的事件:IO操作,按钮点击,绘图等消息。任意ioslate中新增的event都会放入消息队列中排队等待
  • microtask queue 微任务队列 值在当前ioslate的任务队列中排队,优先级高于event queue

Dart代码的运行是从main函数开始的,main函数执行完后,Event looper开始工作,Event looper优先全部执行完Microtask queue中的event
直到Microtask queue为空时,才会执行Event queue中的event,后者为空时才可以退出循环,这里强调“可以”而不是“一定”要退出,视场景而定。

Future就是一个event,我们在写下拉刷新时用到的RefreshIndicator的onRefresh函数也是一个event。每一个被await标记的句柄都是一个event

3.3 Stream

Stream是Dart语言中的所谓异步数据序列的东西,简单理解,其实就是一个异步数据队列而已。我们知道队列的特点是先进先出的,Stream也正是如此

后续会详细介绍

4. 异常

指定异常或多个异常捕获

使用 on关键字,可以指定捕获某一类异常

num str2Num(String str){
  var result= 0;
  try {
    result= num.parse(str);
  } on FormatException catch (e) {
    print('发生Format异常:$e');
  } on IOException catch(e){
    print('发生IO异常:$e');
  } finally {
    print('最终会被执行的代码块');
  }
  return result;
}

发布了85 篇原创文章 · 获赞 265 · 访问量 47万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览