• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Dart语言简述

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Dart是一种“结构化的web编程”语言,Dart编程语言在所有现代浏览器和环境中提供高性能。Dart是谷歌开发的计算机编程语言,后来被ECMA认定为标准。

Dart重要的概念:

1、所有的东西都是对象。无论是变量、数字、函数等都是对象。所有的对象都是实例。所有的对象都继承自内置的Object类。这点类似于JAVA语言的“一切皆为对象”。

2、程序中指定数据类型使得程序合理地分配内存空间,并帮助编译器进行语法检查。但是,指定类型不是必须的。Dart语言是弱数据类型。

3、Dart代码在运行前解析。指定数据类型和编译时的长列,可以提高运行速度。

4、Dart程序有统一的程序入口:main()。这一点与JAVA、C/C++语言相像。

5、Dart没有public、protected和private的概念。私有特性通过变量或函数加下下划线来表示。

6、Dart的工具可以检查出警告信息(warning)和错误信息(errors)。警告信息只是表明代码可能不工作,但是不会妨碍程序运行。错误信息可以是编译时的错误,也可能是运行时的错误。编译时的错误将阻止程序运行,运行时的错误将会以异常(execption) 的方式呈现。

7、Dart支持anync/await异步处理。

8、关键字

       
abstract 2 dynamic 2 implements 2 show 1
as 2 else import 2 static 2
assert enum in super
async 1 export 2 interface 2 switch
await 3 extends is sync 1
break external 2 library 2 this
case factory 2 mixin 2 throw
catch false new true
class final null try
const finally on 1 typedef 2
continue for operator 2 var
covariant 2 Function 2 part 2 void
default get 2 rethrow while
deferred 2 hide 1 return with
do if set 2 yield 3

避免使用这些单词作为标识符。但是,如有必要,标有上标的关键字可以是标识符:

  • 带有上标1的单词是上下文关键字,仅在特定位置有意义。它们在任何地方都是有效的标识符。

  • 带有上标2的单词是内置标识符。为了简化将JavaScript代码移植到Dart,这些关键字在大多数地方都是有效的标识符,但它们不能用作类或类型名称,也不能用作导入前缀。

  • 带有上标3的单词是与Dart 1.0发布后添加的异步支持相关的有限保留字。不能在任何被标记asyncasync*sync*标记的函数体中使用awaityield作为标识符。

表中的所有其他单词都是保留字,不能是标识符。

Dart语言的常用库

包名 概述
dart:async 异步编程支持,提供Future和Stream类
dart:collection 对dart:core 提供更多的集合支持
dart:convert 不同类型(JSON、UTF-8)间的字符编码、解码支持
dart:core Dart语言内建的类型、对象以及dart语言核心的功能
darr:html 网页开发用到的库
dart:io 文件读写I/O相关操作的库
dart:math 数字常量及函数,提供随机数算法 
dart:svg 事件和动画的矢量图像支持

其中三个开发库的使用频率最高:

dart:core  核心库,包含strings、numbers、collections、errors、dates、URIs等。

dart:html  网页开发里DOM相关的一些库。

dart:io  I/O命令行使用的I/O库。

dart:core库时Dart语言初始已经包含的库,其他的任何库在使用前都需要加上import语句。

变量与基本数据类型:

在Dart里,变量声明使用var关键字。在Dart语言里一切且为对象,所以如果没有将变量初始化,那么它的默认值为null。

全局变量特点:全局变量常驻内存、全局变量污染全局
局部变量特点:不常驻内存会被垃圾机制回收、不会污染全局

1、常量和固定值

常量及固定值在开发中很常见。如果定义的变量不会变化,可以使用final或const来指明。const是一个编译时的常量;final的值只能被设定一次。

例如:第一行代码设置了一个常量,如果第二行进行重新赋值,那么将引发异常。

final username = "张三";  //定义了一个常量
//username = "李四";  //会引发一个错误

通过对const类型做四则运行将自动得到一个const类型的值。下面代码会得到一个常量,计算圆的面积:

const pi = 3.1415926;
const area = pi * 100 * 100;

可以通过const来创建常量的值,就是说const[]本身是构造函数,示例代码如下:

final stars = const [];
const buttons = const [];

2、基本数据类型

Dart语言常用的基本数据类型包括:Number、String、Boolean、List、Map。

(1)Number类型:包括int整型, double浮点型

int和double类型都是num类型的子类。int类型不能包含小数点。

int必须是整型;double即可以是整型,也可以是浮点型。

num类型包括的操作有:+,-,*,/,% 以及位移操作>>。num类型包括的常用方法有:abs、ceil和floor。

(2)String类型:字符串类型

String str = "This is flutter";

可以使用三个单引号或双引号来定义多行的String类型,在Flutter中我们专门用来表示大文本块。

var s1 = ''' '''
var s2 = """ """
//请注意这是一个用三个引号包裹起来的字符串,可以用来添加多行数据

字符串类型拼接:

String str1 = "Hello";
String str2 = "World"
print(str1 + str2); //Hello World
print(str1 + " " + str2); //Hello World

(3)Boolean类型

Dart是强bool类型检查,只有bool类型的值是true才被认为是true。有的语言里0是false,大于0是true。在Dart语言里则不是,值必须为true或者false

var sex = "";
if(sex){
  print("你的性别是!" + sex);  
}

上面的示例代码编译不能正常通过,因为sex变量是一个字符串,不是使用条件判断语句,必须用bool类型才可以。

(4)List类型

在Dart语言中,具有一系列相同类型的数据称为List对象。Dart里的List对象类似于JavaScript语言的数组Array对象。

//第一种定义List方式
var list1 = [1, 2, 3];

//第二种定义List方式
var list2 = new List();
list2.add("a");
list2.add(123);
list2.add("c");

//定义List指定类型
var list3 = new List<String>();
list3.add("a");
list3.add("b");

List常用属性

length    长度
reversed    翻转
isEmpty    是否为空
isNotEmpty    是否不为空

var arr = ["香蕉","苹果","橘子"];
print(arr.length); //3
print(arr.reversed); //(橘子, 苹果, 香蕉)
print(arr.isEmpty); //false
print(arr.isNotEmpty); //true

var newArr = arr.reversed.toList();
print(newArr); //[橘子, 苹果, 香蕉]

List常用方法

add    增加
addAll    拼接数据
indexOf    查找 传入具体值
remove    删除 传入具体值
removeAt    删除 传入索引值
fillRange    修改
insert(index,value);    指定位置插入
insertAll(index,list);    指定位置插入List
toList()     其他类型转换成List
join()     List转换成字符串
split() 字符串转换成List
forEach()
map
where
any
every

var arr = ["香蕉","苹果","橘子"];
arr.add("桃子");
print(arr); //[香蕉, 苹果, 橘子, 桃子]
arr.addAll(["西瓜","草莓"]);
print(arr); //[香蕉, 苹果, 橘子, 桃子, 西瓜, 草莓]
print(arr.indexOf("苹果"));  //1  
//indexOf查找不到的话,返回-1;查找到的话,返回索引值
arr.remove("西瓜");
print(arr); //[香蕉, 苹果, 橘子, 桃子, 草莓]
arr.removeAt(3);
print(arr); //[香蕉, 苹果, 橘子, 草莓]
arr.fillRange(1, 2, "aaa"); //修改
print(arr); //[香蕉, aaa, 橘子, 草莓]  
arr.insert(2, "bbb"); //插入
print(arr); //[香蕉, aaa, bbb, 橘子, 草莓] 
arr.insertAll(1, ["123","456"]); //插入多个
print(arr); //[香蕉, 123, 456, aaa, bbb, 橘子, 草莓]
var arr = ["香蕉","苹果","橘子"];
var str = arr.join("-"); //List转换成字符串
print(str); //香蕉-苹果-橘子
var newArr = str.split("-"); //字符串转换成List
print(newArr); //[香蕉, 苹果, 橘子] 

forEach:循环遍历

List arr = ["香蕉","苹果","橘子"];
arr.forEach((value){
     print(value);
});

map:常用于修改集合里的数据

//循环遍历修改List
List myNum = [1,3,5];
List newNum = new List();
for(var i = 0; i < myNum.length; i++){
   newNum.add(myNum[i]*2);
}
print(newNum); //[2, 6, 10]
//可以用map来实现
List myNum = [1,3,5];
var newNum = myNum.map((value){
    return value*2;
});
print(newNum.toList()); //[2, 6, 10]

where:把满足条件的返回一个新的集合

List myNum = [1,3,4,5,7,8,9];
var newNum = myNum.where((value){
    return value > 5;
});
print(newNum.toList()); //[7, 8, 9]

any和every:判断List里有没有满足条件的,有的话返回true或false

//any
List myNum = [1,3,4,5,7,8,9];
var f = myNum.any((value){ //只要集合里有满足条件的就返回true
    return value >5; 
});
print(f); //true
//every
List myNum = [1,3,4,5,7,8,9];
var f = myNum.every((value){ //集合里面每一个都要满足条件返回true,否则返回false
    return value >5; 
});
print(f); //false

(5)Map类型

Map常用属性:

keys    获取所有的key值
values    获取所有的value值
isEmpty    是否为空
isNotEmpty     是否不为空

var person = {
      "name":"张三",
      "age":20,
      "sex":"",
};
print(person.keys.toList()); //[name, age, sex]
print(person.values.toList()); //[张三, 20, 男]
print(person.isEmpty); //fales
print(person.isNotEmpty); //true

Map常用方法:

remove(key) 删除指定key的数据
addAll({...}) 合并映射 给映射增加属性
containsValue 查看映射内的值 返回true/false
forEach
map
where
any
every

var person = {
      "name":"张三",
      "age":20,
      "sex":"",
    };
person.addAll({"work":["程序员","外卖员"],"height":170});
print(person); //{name: 张三, age: 20, sex: 男, work: [程序员, 外卖员], height: 170}
person.remove("sex");
print(person); //{name: 张三, age: 20, work: [程序员, 外卖员], height: 170}
print(person.containsValue("张三")); //true

forEach():

var person = {
    "name":"张三",
    "age":20,
    "sex":"",
};
person.forEach((key,vlaue){
    print("$key--$vlaue");
});
//如果是一行代码也可以用=>
person.forEach((key,vlaue)=>print("$key--$vlaue"));

Map类型将key和value关联在一起,也就是键值对。像其他支持Map的编程语言一样,key必须是唯一的。

var week = {
   "Monday" : "星期一",
   "Tuesday" : "星期二",
   "Wednesday" : "星期三",
   "Thursday" : "星期四",
   "Friday" : "星期五",
   "Saturday" : "星期六",
   "Sunday" : "星期日",      
};
print(week["Monday"]);
//也可以使用Map对象的构造函数Map()来创建Map对象 var week = new Map(); week["Monday"] = "星期一"; week["Tuesday"] = "星期二"; week["Wednesday"] = "星期三"; week["Thursday"] = "星期四"; week["Friday"] = "星期五"; week["Saturday"] = "星期六"; week["Sunday"] = "星期日";

添加新的key-value对,再给week添加一个值,注意,其中0为键不是数组的下标索引:week['0'] = '星期一';

检查key是否在Map对象中:assert(week['Monday'] == null);

使用length来获取key-value对的数量,现在我们调用length输出长度为8,原因是刚才后面又添加了一个数据(0),代码如下:

    var week = new Map();
    week['Monday'] = "星期一";
    week['Tuesday'] = "星期二";
    week['Wednesday'] = "星期三";
    week['Thursday'] = "星期四";
    week['Friday'] = "星期五";
    week['Saturday'] = "星期六";
    week['Sunday'] = "星期日";
    week['0'] = '星期一';
    print(week);  //{Monday: 星期一, Tuesday: 星期二, Wednesday: 星期三, Thursday: 星期四, Friday: 星期五, Saturday: 星期六, Sunday: 星期日, 0: 星期一}
    print(week.length); //8

(6)Set:表示对象的集合,其中每个对象只能出现一次。

Set:用它最主要的功能就是去除数组重复内容
Set是没有顺序且不能重复的集合,所以不能通过索引去获取值

var ss = new Set();
ss.add("香蕉");
ss.add("苹果");
ss.add("香蕉");
print(ss); //{香蕉, 苹果}
print(ss.toList()); //[香蕉, 苹果]

var arr = new List();
arr.add("香蕉");
arr.add("苹果");
arr.add("香蕉");
print(arr); //[香蕉, 苹果, 香蕉] 

var arr = ["香蕉","苹果","橘子","香蕉","苹果","香蕉","苹果"];
var ss = new Set();
ss.addAll(arr);
print(ss.toList()); //[香蕉, 苹果, 橘子]
Set也可以用forEach()循环遍历:
var ss = new Set();
ss.addAll([11,22,333]);
ss.forEach((value){
    print(value);
});

//如果只有一行代码可以用=>
ss.forEach((value)=>print(value));

is 关键词来判断类型:

//加入str是后台返回的数据,不知道是什么类型,可以用is来判断
var str = '1234';
    if(str is String){
      print('是string类型');
    }else if(str is int){
      print('是int类型');
    }else{
      print('是其他类型');
    }
//是string类型

Dart类型转换:

(1)Number类型转换为String类型:toString()

var myNum = 123;
var str = myNum.toString();
print(str is String);  //true

(2)String类型转换为Number类型:parse()

String str = "123";
var myNum = double.parse(str); //String类型转换Number类型的时候建议用double,用int的话,如果有小数会报错
print(myNum is double);  //true

(3)其他类型转换成Boolean类型

isEmpty:判断字符串是否为空 

var str = 'xxx';
if(str.isEmpty){
    print('str为空');
}else{
    print('str不为空');
} 
//str不为空
var myNum1 = 0/0;
if(myNum1.isNaN){
    print('NaN');
}else{
    print(myNum1);
}
//NaN 

var myNum2 = 1;
if(myNum2.isNaN){
    print('NaN');
}else{
    print(myNum2);
}
//1

3、函数

Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象。

函数可以像参数一样传递给其他函数,这样便于做回调处理。

//判断两个字符串是否相等
bool equal(String str1, String str2) {
    retrue str1 == str2;
}

(1)可选参数

将参数使用中括号[]括起来,用来表明是可选位置参数。

例如:总共传入了三个参数,其中name和sex是必须传入的参数,from参数可以不传,代码如下:

//获取用户信息
String getUserInfo(String name, String sex, [String from]) {
  var info = '$name 的性别是 $sex';
  if(from != null){
      info = ‘$info来自$from’;    
  }    
  return info;    
}

void test(){
  pring(getUserInfo(‘小王’, ''));  
}

(2)参数默认值

如果参数指定了默认值,当不传入值时,函数里会使用这个默认值。如果传入了值,则用传入的值取代默认值。通常参数的默认值为null。

改造上面获取用户信息的例子,给from参数赋上默认值,代码如下:

//获取用户信息 使用等号= 来设置默认位置参数
String getUserInfo(String name, String sex, [String from = '中国']) {
  var info = '$name 的性别是 $sex';
  if(from != null){
      info = ‘$info来自$from’;    
  }
  return info;    
}

void test(){
  pring(getUserInfo(‘小王’, ''));  
}

 调用上面的test()方法可以输


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap