前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart 相关语法笔记

Dart 相关语法笔记

作者头像
Hankkin
发布2020-01-13 17:10:09
4770
发布2020-01-13 17:10:09
举报
文章被收录于专栏:Android干货园Android干货园

1. 级联操作符

代码语言:javascript
复制
		//常规操作
    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 关键字

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

代码语言:javascript
复制
---->[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中支持引入的包中被隐藏的对象无法被外界访问

代码语言:javascript
复制
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

代码语言:javascript
复制
  //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对象,所以我们可以这样写:

代码语言:javascript
复制
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关键字,可以指定捕获某一类异常

代码语言:javascript
复制
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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 级联操作符
  • 2.引用库冲突
    • 2.1 as 关键字
      • 2.2 控制显隐部分导入
        • 2.3 权限访问控制
        • 3. 异步
          • 3.1 async和await
            • 3.2 Future
              • 3.3 Stream
              • 4. 异常
              相关产品与服务
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档