美文网首页
Dart语法学习1

Dart语法学习1

作者: StrivEver | 来源:发表于2020-07-12 01:20 被阅读0次

    前言 为什么学习Dart?


    1. Dart语法简洁高效,拥有数以千计的packages 生态系统

    2. Dart 提供提前编译优化,以在移动设备和 web 上实现可预测的高性能和快速启动

    3. Dart 可以编译成 ARM 和 x86 代码,因此 Dart 移动应用程序可以在 iOS,Android 及 更高版本上实现本地运行。 对于 web 应用程序,Dart 可以转换为 JavaScript

    4.Dart 是面向对象的编程语言,语法风格对于许多现有的开发人员来说都很熟悉。 如果您有一定的面向对象编程语言的基础 ,那么使用 Dart 也就是分分钟的事情

    5.Dart 可以便捷的进行响应式编程。由于快速对象分配和垃圾收集器的实现, 对于管理短期对象(比如 UI 小部件), Dart 更加高效。 Dart 可以通过 Future Stream 的特性和API实现异步编程。

    1. 同时也为Flutter学习打下一定的基础

    二. 语言特点

    1. Dart是一门纯粹的面向对象语言,在Dart中一切皆对象;函数(函数可以作为参数传递),字符串,数字等都是对象。

    如下代码,数字可以调用对象方法

    var text = 666.toString();
    print(text);
    

    函数作为对象传递

    var list = [1, 2, 3];
      printEle(element) {
        print("输出值 is $element");
      }
     list.forEach(printEle);
    

    系统函数forEach参数要求传一个函数

     /**
       * Applies the function [f] to each element of this collection in iteration
       * order.
       */
      void forEach(void f(E element)) {
        for (E element in this) f(element);
      }
    
    2. Dart是一门强类型语言(js是一门弱类型语言),但也支持一些弱类型特性如:varobjectdynamic等;
    • var 实际上是编译器语法糖,声明变量后会自动推导类型,不可更改赋值类型

    • dynamic 表示动态任意类型,可以赋值任意类型,编译阶段不检测类型,被编译后是object类型

    • object 表示动态任意类型,可以赋值任意类型,编译阶段检查类型

    • 测试以下代码(可以打开注释,方便理解)*

      var p1 = 1;
      Object p2 = 2;
      dynamic p3 = 3;
      //p1 = 'A';编译期会报错;A value of type 'String' can't be assigned to a variable of type 'int'.
      // p1 = 'A';
      // p2,p3改变类型不会报错,因为都表示任意类型
      p2 = 'B';
      p3 = 'C';
    
    //p2 因为Object编译期会检查类型,发现p2没有未定义 run函数 而报错 ;The method 'run' isn't defined for the type 'Object'.
      // p2.run();
    //p3  dynamic编译器不检测类型,不会报错,运行时抛出异常;NoSuchMethodError: Class 'String' has no instance method 'run'.
      p3.run();
      print(p1);
      print(p2);
      print(p3);
    
    1. 兼具编译性语言特点和解释性语言特点
    • 对开发web应用来讲:dart会被转译成js
    • 对app、服务端、桌面应用讲:dart提供了开发模式,通过vm解释执行,支持热更新,具有解释型语言特点;也提供了生产模式,通过编译成机器码执行,具有编译型语言特点

    三.开始学习吧

    1. Dart支持以下基本数据类型:
    • Numbers
    • Strings
    • Booleans
    • List(数组)
    • Maps(字典键值对)

    2. 变量声明:
    • 可以显示声明指明类型,方便编译器做一些静态检查如:
      int age = 18;
    • 可以var声明类型,变量初始化后自动推导类型,并且不可更改赋值类型
      var p1 = 1;
      注意以下写法也是正确的:
     var name;
      name = "无名氏";
      name = 18;
      name.run();
      print(name);
    

    声明时不赋值则等同于声明了一个动态类型(dynamic)变量


    1. static final const关键字
    • static:用于修饰成员变量,这个变量是属于的,而不是属于对象的,除此之外没有其他别的含义了
    • final修饰的变量不许进行初始化,赋值之后不能再改变;编译期和运行期确定值都可以
    • const修饰变量,必须进行初始化,赋值之后不能再改变,该变量必须编译器就确定,否则会报错
    getInfo() {
        return "个人信息";
      }
    
      const name = "我爱学习啊";
     //报错,因为编译期间不能确定info值;Const variables must be initialized with a constant value.
      const info = getInfo();
    
      final name1 = "我也爱学习";
    //不报错
      final info1 = getInfo();
    

    const还可以用来构造对象;表明该对象在编译期就能够完全确定,所以该对象类所有属性都必须使用final 或者 const修饰,也就是说该对象所有属性都是不能改变的既该对象是不可变的;

    void main() {
      People p = const People("flutter");
    }
    
    class People {
      final name;
      const People(name) : this.name = name;
    }
    

    如果对象类属性不适用final修饰,则该对象某个属性是可变的,那么该对象就不能被称为是不可变的,所以会报错;

    void main() {
      People p = const People("flutter");
    }
    
    class People {
      final name;
    //也可以
      static const height = 180;
      int age;
    //Can't define a const constructor for a class with non-final fields.
      const People(name) : this.name = name;
    }
    

    const构造集合,说明该集合完全不可变,类似OC中不可变集合;

      const array = const [1, 2, 3];
      array[0] = 0;
      //运行时报错;Unhandled Exception: Unsupported operation: Cannot modify an    unmodifiable list
      print(array);
    

    相同的const变量,内存中只会创建一次

      var list1 = const [1, 2, 3];
      var list2 = const [1, 2, 3];
      //判断是否指向同一个对象
      bool result = identical(list1, list2);
      if (result) {
        print("是同一个对象");
      } else {
        print("不是同一个对象");
      }
    

    输出flutter: 是同一个对象


    1. 变量未初始化的默认值:
      在Dart中未初始化变量都为null,null也是Object子类
      var name;
      int age;
      Object people;
      List list;
      dynamic dy;
      print(name);
      print(age);
      print(people);
      print(list);
      print(dy);
    
    

    全输出null



    5.类型判断:
    a is Object去判断
    //输出 true
    print(null is Object);
    //输出 true debug下输出,release忽略
    assert(null is Object);
    

    1. 类型转换:
      Dart是强类型语言,所以需要显示转换。常见的转换:
      String aa = "111";
      //String-> int
      int bb = int.parse(aa);
      // int -> double
      double cc = bb.toDouble();
      // String -> double
      double dd = double.parse("1.1");
      // num -> String
      aa = cc.toString();
      //double指定位数 ->String
      String ee = 3.141592.toStringAsFixed(3); //结果为3.141
    

    相关文章

      网友评论

          本文标题:Dart语法学习1

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