美文网首页
Dart相关语法笔记

Dart相关语法笔记

作者: Hankkinn | 来源:发表于2020-01-09 15:57 被阅读0次

    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;
    }
    
    

    相关文章

      网友评论

          本文标题:Dart相关语法笔记

          本文链接:https://www.haomeiwen.com/subject/izwyactx.html