Dart2基础

数据类型

变量与常量

var

使用var声明变量,可赋予不同类型的值
未初始化时,默认值为null

final

使用final声明一个只能赋值一次的变量

const
使用const声明的必须是编译期常量

内置类型

数值型-Number、字符串-String、布尔型-Boolean、列表-List、键值对-Map、Runes、Symbols

数值型-Number

使用关键字num来表示,分为两种: 整形int   浮点型 double
int、double都继承于num
  • 数值型操作

    运算符

      +(加)、-(减)、*(乘)、/(除)、~/(取整)、%(取余)
    

    常用属性

       isNaN(是否为非数字)、isEven(是为偶数)、isOdd(是否为奇数)等
    

    常用方法:

      取绝对值abs()、round()四舍五入、取不大于它的最大整数floor()、取不小于它的最小整数ceil()、转为整形toInt()、转为浮点型toDouble()
    

字符串 字符串-String

使用单引号、双引号创建字符串;
使用三个引号或双引号创建多行字符串;
使用r创建原始raw字符串(即使有转义字符也会被打印出来,例如:r'Hello \n Dart',打印出来的就是Hello \n  Dart,不会转义换行)
  • 字符串操作

运算符

 +(和java一样)、*(和Python一样,例如"new"*4,就是复制4次,即: new new new new)、==(比较内容是否相等)、[](取字符,下标从0)

插值表达式:${expression}
int a=1;
int b=2;
print("a+b=${a+b}");
print("a=$a");
输出为:a+b=3
a=1

常用属性

length、isEmpty、isNotEmpty和java相同

**常用方法 **

contains()、subString()、startsWith()、endsWith()、indexOf()、lastIndexOf()、toLawerCase()、
toUpperCase()、trim()、split()和java相同 
trimLeft()将字符串最前面的空格修整掉、trimRight()消除从右侧起所遇到的所有空格字符
replaceXXX()

布尔型

  • 使用bool表示布尔类型
  • 布尔值只有true和false

列表(数组)–List

dart中列表和数组是同一个

创建

  • 创建List: var list=[1,2,3];
  • 创建不可变的List:var list=const[1,2,3];
  • 构造创建:var list=new List();

常用操作(同Java)

  • [],length
  • add(),insert()
  • remove(),clear()
  • indexOf(),lastIndexOf()
  • sort(),sublist()
  • shuffle(),asMap(),列表for循环forEach()

Map

创建

  • 创建Map:
    var language={‘first’:‘Dart’,‘second’:‘Java’};
  • 创建不可变Map:
    var language=const{‘first’:‘Dart’,‘second’:Java};

常用操作(同Java)

  • [],length
  • isEmpty(),isNotEmpty()
  • Keys,values
  • 是否包含某个key:containsKey(),是否包含某个value:containsValue()
  • remove()
  • forEach()
    例如:
mapforEach(f);
void f(key,value){
    print("key"=$key,value=$value);
}

dynamic关键字

多种不同类型


运算符

算术运算符

  • 加减乘除:
+(加)、-(减)、*(乘)、/(除)、~/(取整)、%(取余)
  • 递增递减:
++var,var++,--var,var--

关系运算符

  • 运算符:==,!=,>,<,>=,<=
  • 判断内容是否相同使用==

逻辑运算符(同java)

  • 运算符:!,&&,||
  • 针对布尔类型运算
bool isTrue=true;
bool isFalse=false;
print(isTrue && isFalse);
print(isTrue || isFalse);
输出:
false
true

赋值运算符

  • 基础运算符:=,??=(如运算符左边是空的就取符号右边的值,如果不为空就取自己的值)
int a=10;
int b;
b ??=a;
print(b);
输出:10

int a=10;
int b=5;
b ??=a;
print(b);
输出:5
  • 复合运算符:+=,-=,*=,/=,%=,~/= (类似于java)

条件表达式

  • 三目运算符:condition ? expr1 : expr2 (与java相同,condition 为true取expr1,condition为false取expr2)
  • ??运算符:expr1 ?? expr2 (如果第一个表达式为空,取第二个表达式的值,如果第一个表达式不为空,取第一个表达式的值)

控制语句 (同java)

if语句

  • if语句
  • if…else if语句
  • if…else if…else语句

for语句

  • for 循环
  • for…in循环 (和js相同)
for(var item in list){
    print(item);
}

while语句

  • while循环
  • do…while循环

break和continue

  • 终止循环:break
  • 跳出当前循环continue

switch…case语句

  • 比较类型:num,String,编译期常量,对象,枚举
  • 非空case必须要有个break
  • default处理默认情况
  • continue跳转标签

方法

方法定义

返回类型  方法名(参数1,参数2,....){
   方法体...
   return 返回值
}

可选参数

  • 可选命名参数:{param1,param2,…}
  • 可选位置参数: [param1,param2,…]
  • 如果存在具体参数,可选参数生命,必须在具体参数后面
void main(){
  printPerSon("老王");
  printPerSon("刑天",age:4000);
  printPerSon("老张",age: 40,gender: "男");
  printPerSon2("汉斯");
  printPerSon2("马飞",23);
  printPerSon2("刘芳",22,"女");
}

/**
 * 具体参数必须放在可选参数前
 */
 printPerSon(String name,{int age,String gender}){
  print("name=$name,age=$age,gender=$gender");
}

/**
 * 具体参数必须放在可选参数前
 */
printPerSon2(String name,[int age,String gender]){
  print("printPerSon2==>name=$name,age=$age,gender=$gender");
}

输出:
name=老王,age=null,gender=null
name=刑天,age=4000,gender=null
name=老张,age=40,gender=男
printPerSon2==>name=汉斯,age=null,gender=null
printPerSon2==>name=马飞,age=23,gender=null
printPerSon2==>name=刘芳,age=22,gender=女

默认参数值

  • 使用=在可选参数指定默认值
void main(){
  printPerSon("老王");
  printPerSon("刑天",age:4000);
  printPerSon("老张",age: 40,gender: "男");
}

 printPerSon(String name,{int age=24,String gender="男"}){
  print("name=$name,age=$age,gender=$gender");
}

输出:
name=老王,age=24,gender=男
name=刑天,age=4000,gender=男
name=老张,age=40,gender=男

方法对象

  • 方法可作为对象赋值给其他变量
  • 方法可作为参数传递给其他方法
void main(){
  //方法作为对象赋值给其他变量
  Function func= printHello;
  func();

  var list=[1,2,3,4];
  //方法作为参数传递给其他方法 print 与 forEach
  list.forEach(print);

  var list2=["h","e","l","l","o"];
  //方法作为参数传递给其他方法 times 与 listTiemes
  print(listTiemes(list2, times));
}

void printHello(){
  print("Hello");
}

/**
 * 方法作为参数传递给其他方法
 */
List listTiemes(List list,String fun(str)){
   for(var index = 0;index

匿名方法

定义

(参数1,参数2,...){
    方法体...
    return 返回值
}

匿名方法特性

  • 可赋值给变量,通过变量进行调用
void main(){
  var func=(str){
    print("匿名方法输出==>$str");
  };
  func(20);

//  //也可以不传递给变量调用匿名方法,但不建议使用,不方便阅读
//  ((){
//    print("Test");
//  })();
}

输出:匿名方法输出==>20
  • 可在其他方法中直接调用或传递给其他方法
void main(){
  var list2=["h","e","l","l","o"];
  //匿名方法作为一个参数给给其他方法调用
  print(listTiemes(list2, (str){
    return str*3;
  }));
}

/**
 * 方法作为参数传递给其他方法
 */
List listTiemes(List list,String fun(str)){
   for(var index = 0;index

闭包

  • 闭包是一个方法(对象)
  • 闭包定义在其他方法内部
  • 闭包能够访问外包方法内的局部变量,并持有其状态
void main(){
  var func = a();
  func();
  func();
  func();
  func();
}

a(){
  int count=0;
//  printCount(){
//    print(count++);
//  }
//  return printCount;
  //使用匿名方法
   return (){
     print(count++);
   };
}

输出:
0
1
2
3

其他

扩展类

使用with关键字后面跟着一个或多个扩展类名

class Musician extends Performer with Mnsical {
    // ...
}

class Maestro extends Person with Musical, Aggressive, Demented {
    Maestro(String maestroName) {
        name = maestroName;
        canConduct = true;
    }
}

要实现扩展类,创建一个没有构造函数,没有父类调用的类

abstract class Musical {
    bool canPlayPiano = false;
    bool canCompose = false;
    bool canConduct = false;

    void entertainMe() {
        if (canPlayPiano) {
            print('Playing piano');
        } else if (canConduct) {
            print('Waving hands');
        } else {
            print('Humming to self');
        }
    }
}

你可能感兴趣的:(Dart2)