Dart语法基础

1.特殊运算符

  • ??=
//原来变量有值时??=不执行,当原来变量为null时将值赋值给这个变量
var name = null;
name ??= "lisi";
print(name);  //输出结果lisi

var name = "a";
name ??= "lisi";
print(name); //输出结果a

  • ??
// ??前面有值就使用??前面的值,??前面为null则使用??后面的值
var name = "a";
var temp = name ?? "lilei";
print(temp);   //输出结果a

var name = null;
var temp = name ?? "lilei";
print(temp);  //输出结果lilei
  • ..(级联运算符),类似链式调用
void main(List<String> args) {
  var dog = Dog()
    ..name = "xiaohuang"
    ..eat()
    ..run();
}

class Dog {
  String? name;
  void eat() {}
  void run() {}
}

2.final和const的区别

const必须赋值,编译期间能确定的常量值
final可以通过函数获取,可以运行期间来确定的值
例子:

const data = DateTime.now()  //错误,编译期间无法确定 
final data = DateTime.now()   //正确

3.集合类型

  • 列表List var list = ["123", "321", "11"];
  • 集合Set var set = {"123", "321", "11"};
  • 映射Map var map = {"name": "zhangsan", "age": 20};

4.函数参数

函数的参数可以分成两类: 必须参数和可选参数,前面使用的参数都是必选参数
Dart的函数不支持函数重载

  • 必传参数
    // 必选参数: 必须传
    void say1(String name) {
      print(name);
    }
    say1("lisi");
    
  • 位置可选参数
    // 位置可以选参数,[]必须按照参数顺序传参,无需参数名
    void say2(String name, [int age = 0, double height = 0]) {
      print(name);
    }
    say2("wangwu");
    say2("zhangsan", 18);
    say2("zhangsan", 18, 1.88);
    
  • 命名可选参数
    // 命名可选参数,{}内参数无顺序要求,但是必须带上参数名
    void say3(String name, {int age = 0, double height = 0}) {
      print(name);
    }
    say3("maliu");
    say3("maliu", age: 18);
    say3("maliu", height: 1.88);
    say3("maliu", age: 18, height: 1.88);
    

5.构造方法

  • 命名构造方法
    因为Dart不支持函数的重载,所以我们没办法创建相同名称的构造方法,这时我们就需要使用命名构造方法
    void main(List<String> args) {
      var a1 = Animal();
      var a2 = Animal.withArgments("dog", 2);
    }
    
    class Animal {
      String? name;
      int? age;
    
      Animal() {
        name = "";
        age = 0;
      }
    
      Animal.withArgments(String name, int age) {
        this.name = name;
        this.age = age;
      }
    }
    
    在实际开发中我们也可以使用命名构造函数来提供更加方便的创建对象方法:
    Animal.fromMap(Map<String, Object> map) {
        this.name = map['name'] as String;
        this.age = map['age'] as int;
    }
    
    var a3 = Animal.fromMap({"name": "cat", "age": 10});
    print("name is ${a3.name} age is ${a3.age}");  //输出结果name is cat age is 10
    
  • 常量构造方法

    在某些特定场景需要我们传入相同参数返回的对象是同一个,这时可以使用常量构造方法,常量构造方法的类中所有属性必须用final修饰,创建对象使用const关键字而不是new关键字
    void main(List<String> args) {
       var dog1 = Dog('xiaohua');
       var dog2 = Dog('xiaohua');
    
       print(identical(dog1, dog2)); //false
    
       var cat1 = const Cat("xiaohuang");
       var cat2 = const Cat("xiaohuang");
       var cat3 = const Cat("xiaohuang2");
       print(identical(cat1, cat2));  //true
       print(identical(cat1, cat3));  //false
    }
    
    class Dog {
      String name;
    
      Dog(this.name);
    }
    
    class Cat {
      final String name;
    
      const Cat(this.name);
    }
    
  • 工厂构造方法

    如果一个构造函数并不总是返回一个新的对象,则使用 factory 来定义 这个构造函数。
    如例子中创建2个名字为‘小黄’的Dog对象工厂返回的是同一个对象并没有创建新的对象。
    这里与其他构造方法的不同点:工厂方法必须有返回值,而构造方法是不能有返回值的.
    void main(List<String> args) {
      var dog1 = Dog("小黄");
      var dog2 = Dog("小黄");
      var dog3 = Dog("小蓝");
      print(identical(dog1, dog2)); //true
      print(identical(dog2, dog3)); //false
    }
    
    class Dog {
      String name;
      static final Map<String, Dog> _cache = <String, Dog>{};
    
      factory Dog(String name) {
        if (_cache.containsKey(name)) {
          return _cache[name] as Dog;
        } else {
          final dog = Dog._internal(name);
          _cache[name] = dog;
          return dog;
        }
      }
    
      Dog._internal(this.name);
    }
    
  • 重定向构造方法

    一个构造函数调用另外一个构造函数(冒号后面使用this调用其他构造函数)
    void main(List<String> args) {
     var dog = Dog("xiaohuang", 2);
     var dog1 = Dog.fromMap({"name": "xiaoghuang2", "age": 12});
    }
    
    class Dog {
     String name;
     int age;
    
     Dog(this.name, this.age);
    
     Dog.fromName(String name) : this(name, 0);
    
     Dog.fromMap(Map map) : this.fromName(map["name"]);
    }
    

6.setter和getter

void main(List<String> args) {
  var dog = Dog("小黄");
  dog.setName = "小黑";
  print(dog.name);
  dog.name = "小白";
  print(dog.getName);
}

class Dog {
  String name;

  String get getName {
    return name;
  }

  set setName(String name) {
    this.name = name;
  }

  Dog(this.name);
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • 本文是对 Dart 语言的官方文档做了简单的翻译和总结,有不当之处敬请指正。如果有时间和精力建议通读官方文档 he...
    小小小超子阅读 10,443评论 8 22
  • 2.1 类的定义 在Dart中,定义类用class关键字。类通常有两部分组成:成员(member)和方法(met...
    金色888阅读 1,207评论 0 0
  • 目录介绍 01.变量声明1.1 var声明变量1.2 变量和常量1.3 dynamic和Object 02.数据类...
    杨充211阅读 947评论 0 1
  • 目录 前言 代码注释 变量和常量 数据类型 操作符 控制流 异常 前言 本篇开始讲解Dart语法,期间会通过对比J...
    地球是猿的阅读 1,113评论 0 0
  • 自从实习结束后直到现在将近一年多的时间再也没有用过kotlin, 在今年五月份I/O大会上,Google再次明确了...
    Scus阅读 1,340评论 0 0