Dart 语言极简入门

1、var 变量、final,const常量编程

  1. 变量var

变量用关键词var来定义,Dart语言是类型推断的因此在定义变量的时候能够不用指明变量的类型,例子以下数组

void main() {
      var name = "小明";
      var age = 10;
      var job;

     print(name);
     print(age);
     print(job);
   }
复制代码

在上面例子中,定义了变量 name 和 age ,job,其中给name赋值 "小明",根据类型推断name就是String 类型的,给 age赋值 10,根据类型推断age 就是 int 类型的。对job没有赋值job变量的默认值就是null。闭包

须要注意的是变量的类型一旦肯定就不能再给他赋不一样类型的值。异步

  1. 常量final,const

常量用 final 或 const 关键字,例子以下async

void main() {
      final a = "好";
      const b = 1;
    }
复制代码

须要注意的是,常量在定义的时候必定要进行赋值,且定义好之后不能被修改不然会报错。编程语言

2、Dart中的数据类型ide

在Dart中all is Object ,Dart 中有 numbers(数值类型),strings (字符串类型),booleans(布尔类型),lists(列表类型),maps(字典类型),runes(字符类型),symbols(符号类型)异步编程

  1. 数值类型

在Dart中数值类型只有int 和 double两种,例子以下函数

void main() {
        int a = 1;
        double b = 2;

        print(a);
        print(b);
   }
复制代码

上面的例子中定义了整数类型的a,和double 类型的 b,打印结果是this

flutter: 1

flutter: 2.0

2.String字符串类型

Dart中字符串用单引号 '' 或双引号 "" 来建立,例子以下:

void main() {
    var a = "热爱编程";
    var b = '哈哈哈哈';
    print(a);
    print(b);
  }
  
  //输出结果:
  //flutter: 热爱编程
  //flutter: 哈哈哈哈
复制代码

字符串的格式化

在Dart 中用 ${} 来进行字符串的格式化,例子以下:

void main() {
    var a = "热爱编程";
    var b = '哈哈哈哈';
    var c =  "咱们都  ${a + b} ";
    print(c);
 }

//输出结果为
//flutter: 咱们都  热爱编程哈哈哈哈
复制代码

上面的例子中字符串 a 和 b 能够用 + 号 直接拼接在一块儿

在字符串中能够用反斜杠\来进行字符转译

字符串的相关方法使用例子以下:

void main() {
    var a = "热爱编程";
    //判断是否为空
    print(a.isEmpty);
    //字符串的长度
    print(a.length);
    //字符串的类型
    print(a.runtimeType);
  }

 //输出结果为:
 //flutter: false
 //flutter: 4
 //flutter: String
复制代码

上面例子是字符串的经常使用方法,isEmpty是判断字符串是否为空,length是求字符串的长度,runtimeType是求字符串的类型。

字符串也是一种集合类型,例子以下:

void main() {
    var a = "热爱编程";
    print(a[1]);
  }
  //输出为:
  //flutter: 爱
复制代码
  1. bool布尔类型

Dart中的布尔类型只有 true和false,例子以下:

void main() {
    var a = false;
    print(a.runtimeType);
 }
 //输出结果:
 //flutter: bool
复制代码

4.List列表类型(数组类型)

用List来定义列表,能够在<>内指定列表元素的数据类型,例子以下:

void main() {
    List<int> a = [10,100,1000];
    List<String> b = ["热", "爱","编","程"];
  }
复制代码

上面例子中,尖括号中的类型用来指定元素的数据类型,若是列表指定了元素的数据类型,就只能存放该种数据类型的数据。若是想在列表中存放不一样类型的数据,能够将列表中元素的类型用dynamic关键字声明为动态类型的,例子以下:

void main() {
    List<dynamic> a = [10,"哈哈哈",99.9];
  }
复制代码

可是在通常开发中咱们不须要指定列表的元素类型,由于Dart是能够类型推断的,因此直接使用var进行声明便可,上面的例子通常以下声明:

void main() {
    var a = [10,"哈哈哈",99.9];
  }
复制代码

列表中的经常使用方法的使用例子以下:

void main() {
    var a = [10,"哈哈哈",99.9];
    //添加元素
    a.add("ccc");
    //删除一个元素
    a.remove(10);
    //元素个数
    a.length;
    //...等等其余方法
  }
复制代码
  1. Map字典类型

字典定义使用例子以下:

void main() {
    Map<String, dynamic> a = {"name": "Flutter" , "languge": "Datr"};
  }
复制代码

用Map来定义一个字典,在尖括号内来指定字典的key和value的数据类型,须要主要的是和数组同样,一旦类型被肯定,那么就必需要和定义的类型一致不然会报错。

由于 Dart是能够类型推断的,因此上面的例子能够直接用var来定义以下:

void main() {
  var a = {"name": "Flutter" , "languge": "Datr"};
  print(a);
}
//输出为:
//flutter: {name: Flutter, languge: Datr}
复制代码

Map能够经过键来获取,设置,新增值,例子以下:

void main() {
  var a = {"name": "Flutter" , "languge": "Datr"};
  //新增键值对
  a["version"] = "1.1.0";
  //修改键值
  a["name"] = "Swift";
  print(a);
}
//输出结果:
//flutter: {name: Swift, languge: Datr, version: 1.1.0}
复制代码

3、Dart中的运算符

1.算数运算符加"+",减 "-" ,乘"*" ,除"/",取整 "~/",取模%

"+"是用来作加的运算,除了数字类型外,字符串,列表,字典也支持相加运算,例子以下:

void main() {

      var a = 10 + 20;
      var b = "10"  + "10";
      print(a);
      print(b);

   }

   //打印结果:
   //flutter: 30
   //flutter: 1010
复制代码

"~/" 是取整的运算符,例子以下:

void main() {
      var a = 15;
      var b =  a ~/ 4;
      print(b);
    }
    //打印结果:
    //flutter: 3
复制代码

再其余运算符与其余编程语言基本同样不作介绍

  1. 比较运算符 == ,!= ,> , < , >= ,<=

与其余语言基本同样不作介绍

3.类型运算符 as,is, is!

as是作类型的转换

is是判断是否属于某个类型

is!是判断是否不属于某个类型

  1. ??

“??” 是Dart的空条件运算符,就是取默认值的意思,例子以下

void main() {
        var a;
        var b = a ?? 1;
        print(b);
    }
    //输出结果:
    //flutter: 1
复制代码

上面的例子中, 变量a没有赋值因此默认为null,在将a赋值给b的时候由于a是null,因此 经过?? 给把1赋值给了a。

5.级联运算符 “..”

级联运算符能够对某个对象进行连续的操做而不用生成中间变量,例子以下: 例子一

class Person{

    func_one(){
      print("Dart语言");
    }

     func_two(){
      print("Flutter使用Dart");
     }
  }

  void main() {
    Person()..func_one()..func_two();
  }
  //打印结果以下:
  //flutter: Dart语言
  //flutter: Flutter使用Dart
复制代码
  1. 点运算符以及“?.”的使用

点运算符用来访问对象的属性或方法,对不肯定是否为null的对象能够用“?.”来进行操做,例子以下:

class Person{
    var name;

  }

  void main() {
    var p = Person();
    print(p?.name);
  }
复制代码

4、 函数

1.函数的通常书写格式:

返回值  函数名称(参数列表){
    函数体
}
复制代码

例子以下:

void main() {

    int func_add(int a,int b){
      return a + b;
    }

    var c = func_add(1, 2);
    print(c);
  }
  //打印结果:
  //flutter: 3
复制代码

上面例子中main函数是程序的入口, 里面定义了func_add函数

Dart中的all is对象, 因此能够将函数赋值给一个变量或者将函数做为参数,例子以下;

void main() {

    int func_add(int a,int b){
      return a + b;
    }

    var c = func_add;
    var d = c(1,2);
    print(d);
 }
复制代码

Dart语言中在定义函数的时候函数的参数类型和返回值类型均可以省略,Dart语言会根据传入的参数和返回的值来动态推断。例子以下:

void main() {

    func_add(a,b){
      return a + b;
    }

    var c =  func_add(1, 2);
    print(c);
}
//打印结果
//flutter: 3
复制代码

若是某个函数的函数体只有一句话能够用箭头函数来定义,例子以下:

void main() {

    func_add(a,b) => a + b;

    var c =  func_add(1, 2);
    print(c);
  }
  //输出结果:
  //flutter: 3
复制代码

2.可选参数的函数定义

名称可选参数函数的通常格式为

返回值类型 函数名称({可选参数列表}){
      函数体
  }
复制代码

可选参数放在{}号内部,例子以下:

void main() {

    func_text({a,b}) {

      if(a != null){
          print(a);
      }

      if(b != null){
         print(b);
      }

     };

     func_text(a: 2);
 }
 //打印结果
 //flutter: 2
 
 上面的例子中定义了函数func_text其中参数 a和b都是可选的,须要注意的是,在调用的时候须要参数名称加:的形式来进行传参数
复制代码

位置可选参数,只须要将可选参数放入中括号便可,例子以下;

void main() {

    func_text(a, [b]) {

      if(a != null){
        print(a);
      }

      if(b != null){
       print(b);
      }

    };

    func_text(2,3);

  }
  //输出结果
  //flutter: 2
  //flutter: 3
复制代码

在上面例子中func_text中有两个参数a和b,其中b 是可选的。在调用的时候能够不传。

函数可选的能够给个默认值,若是没有默认值函数中取到的参数值为null,,设置默认值之后若是调用的时候没有传入这个参数,在函数内就会使用默认值,在定义可选参数的时候应该尽可能提供一个默认值。

例子以下:

void main() {

      func_text(a, [b = 4]) {

       if(a != null){
          print(a);
        }

        if(b != null){
           print(b);
        }

       };

      func_text(3);
  }
  
  //打印以下:
  //flutter: 3
  //flutter: 4
复制代码

三、匿名函数

Dart中没有名称的函数是匿名函数,匿名函数能够直接赋值给变量,经过变量来调用。例子以下:

void main() {

    var a = (b,c){
      return b + c;
    };

    var d = a(1,2);
    print(d);
  }
  //打印以下:
  //flutter: 3
复制代码

在上面的例子中,把匿名函数赋值给了变量a,而后经过a来调用。

5、闭包

闭包是一种特殊的函数。

闭包是定义在函数内部的函数。

闭包可以访问外部方法内的局部变量并持有。

经典例子以下:

void main() {

    var  func = a();
    func();
    func();
    func();
  }

  a(){
    int count = 0;

    func_count(){
       print(count ++);
    }
    return func_count;
 }
 //打印结果:
 //flutter: 0
 //flutter: 1
 //flutter: 2
复制代码

上面例子中, 函数a中的 func_count函数就是闭包,他定义在a函数内,可以访问并持有他外部函数的局部变量count,暂时理解到这里后面会详细说明闭包的使用。

6、类

Dart是基于类和继承的面向对象的语言。对象是类的实例。在类中定义了对象的属性和方法。

  1. 自定义类和类的构造函数

Dart中用 class关键字来进行类的定义,例子以下:

class Person {
    
    double weight;
    int age;
}
复制代码

上面的例子中定义了Person类,类中定义了两个属性weight和age;咱们能够经过Person来建立对象,经过类来建立对象须要调用类的构造函数。类的构造函数通常和类的名字同样。当定义一个类时Dart会默认生成一个没有参数的构造函数,能够直接经过类的名称来调用。例子以下:

class Person{
          var name;

     }

  void main() {
    var p = Person();
    print(p?.name);
  }
复制代码

上面的例子中,定义的Person类能够直接经过Person()来建立对象。类对象中的方法属性均可以经过点来访问调用。

通常Dart语言的构造方法的书写格式以下:

class Person{
          var name;
          var age;
          
          //通常构造方法的书写格式
          Person(this.name,this.age);

     }
复制代码

2.类的实例方法:

类定义了属性和方法,通常属性用来存储数据,方法用来定义行为。

例子以下:

class Person{
          var name;
          var age;
          
          //通常构造方法的书写格式
          Person(this.name,this.age);
          
          func_run(){
             print("在跑步");
          }
}
复制代码

上面的例子中定义了方法func_run()就是Person类中的方法。调用的例子以下:

void main() {
    var p = Person();
    p.func_run();
}
复制代码

在类中用this来访问自身的属性和方法,例子以下:

class Person{
          var name;
          var age;
          
          //通常构造方法的书写格式
          Person(this.name,this.age);
          
          func_run(){
             print(" ${this.name}  在跑步"); //用this访问name属性
          }
}
复制代码

类中还有两个比较特殊的方法,Setters 和 Getters方法,Setters用来设置对象的属性,Getters用来获取对象的属性。在定义属性时Dart会默认生成Setters和Getters方法。

  1. 抽象类和抽象方法

Dart中 在抽象类中能够定义抽象方法,抽象方法是只有定义没有函数实现的方法。抽象方法是面向接口开发的基础。

抽象类用abstract关键字来定义。例子以下:

abstract class PersonInterface{
         func_run();
   }
复制代码

上面例子中定义了一个PersonInterface 的接口,里面只定义了一个func_run()的抽象方法。Person类能够对这个接口进行实现例子以下:

abstract class PersonInterface{
         func_run();

 }
 
 class Person implements PersonInterface{
          var name;
          var age;
          
          //通常构造方法的书写格式
          Person(this.name,this.age);
          
          实现接口函数
          func_run(){
             print(" ${this.name}  在跑步"); //用this访问name属性
          }
}
复制代码

一个类也能够同时实现多个接口。

抽象类不能够被实例化。

  1. 类的继承

子类继承父类,就可使用父类中的属性和方法。而且子类能够重写夫类中的属性和方法。Dart中用extends关键字来进行类的继承。例子以下:

class Person{
          var name;
          var age;
          //通常构造方法的书写格式
          Person(this.name,this.age);
          
          func_run(){
             print("在跑步");
          }
}

class Man extends  Person{
    
    //构造函数调用夫类的构造函数
    Man(name,age) : super(name,age);
    
    func_eat(){
        print("正在吃饭");
    }
    
}
复制代码

上面的例子中Man类继继承了Person类,须要注意的是构造函数不能被继承,但能够经过super来调用夫类的方法。子类也能够重载父类的方法。例子以下:

class Person{
          var name;
          var age;
          //通常构造方法的书写格式
          Person(this.name,this.age);
          
          func_run(){
             print("在跑步");
          }
}

class Man extends  Person{
    
    //构造函数调用夫类的构造函数
    Man(name,age) : super(name,age);
    
    func_eat(){
        print("正在吃饭");
    }
    
    @override
    func_run(){
        print("Man在跑步");
    }

}
复制代码

上面例子中子类重载父亲类的func_run()方法,其中@override关键字用来标注这个方法是子类重载夫类的,@override关键字能够省略。

  1. 枚举

枚举用enum来定义。例子以下:

enum  Language{
      Dart,
      Oc,
      Swift
  }


  class Person{
          var name;
          Language language;
          
          //通常构造方法的书写格式
          Person(this.name,this.language);

 }
    
    
    void main() {
         var p = Person();
         p.language = Language.Dart;
         print(p.language);
   } 
   
   //输出:
   //Dart
复制代码

七、 类的Mixin特性

Mixin是Dart中很是强大的一个功能。Dart语言是但继承的只能继承一个父类。不少时候须要集合多个类的功能来实现一个复杂的自定义类,这时候Mixin特性就会用到。

Mixin的功能就是让一个类把其余类的功能混合进来。例子以下:

能被用来混合的类是Mixin类,Mixin类不能实现构造方法不然不能被其余类混合,用with关键字来进行混合。Mixin也支持多混合。

  1. 范型

例子以下:

class Person{
          T data;  
          //通常构造方法的书写格式
          Person(this.data);
 }
复制代码

** 7、异步编程 async , await , Future的使用**

8、模块的引用

用 import来倒入模块

例子:

import "./lib/aa.dart";

重名的话能够用as来从新定义名称以下

import "./lib/aa.dart" as bb;

使用:
 void main() {
         aa();
         bb.aa();
  } 
复制代码

未完待续

相关文章
相关标签/搜索