Dart2基础

Posted 子不语归来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<list.length;index++)
     list [index]=fun(list[index]);
   
   return list;

String times(str)
  return str*3;


输出:
Hello
1
2
3
4
[hhh, eee, lll, lll, ooo]

匿名方法

定义

(参数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<list.length;index++)
     list [index]=fun(list[index]);
   
   return list;


输出:[hhh, eee, lll, lll, ooo]

闭包

  • 闭包是一个方法(对象)
  • 闭包定义在其他方法内部
  • 闭包能够访问外包方法内的局部变量,并持有其状态
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基础的主要内容,如果未能解决你的问题,请参考以下文章

在初始化程序中只能访问静态成员。 Dart2.0

dart2js 代码如何比 javascript 更快?

dart2js 后异步函数中两个 keyCode 的比较不正确

从 dart2js 或 dart-analyzer 获取类型化语法树

如何在 Windows 上使用 dart-sdk (dart2native) 和 flutter/dart-sdk?

Dart 语言基础浅析