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基础的主要内容,如果未能解决你的问题,请参考以下文章
dart2js 后异步函数中两个 keyCode 的比较不正确
从 dart2js 或 dart-analyzer 获取类型化语法树