Dart - 快速入门(一)

文章目录[x]
  1. 1:一些基础概念
  2. 2:变量
  3. 3:默认值
  4. 4:Final和const
  5. 5:内置类型
  6. 5.1:数字(number)
  7. 5.2:字符串
  8. 5.3:布尔值
  9. 5.4: 数组
  10. 5.5: Map
  11. 6: 函数
  12. 6.1:可选的参数
  13. 6.2:匿名函数
  14. 6.3:返回值

Dart是一种适用于万维网的开放源代码编程语言,由Google主导开发,于2011年10月公开。它的开发团队由Google Chrome浏览器V8引擎团队的领导者拉尔斯·巴克主持,目标在于成为下一代结构化Web开发语言,由于JavaScript的大热,其一直处于异常尴尬的位置。但由于Flutter的公布,从2018年开始便开始在国内外火了起来,由此将介绍该语言一系列教程。

一些基础概念

1、可以放在变量中的所有东西都是一个对象,每个对象都是一个类的实例。数字、函数、和null都是对象。所有对象都从Object类继承。

2、虽然Dart是强类型的,但类型注释是可选的,因为Dart可以推断类型。当想明确地说没有类型时,可以使用特殊的dynamic

3、Dart支持泛型类型,如List<int>或者List<dynamic>(任何类型的对象列表)。

4、Dart支持顶层函数如main(),以及与类或对象绑定的函数(分别为staticinstance方法),也可以在函数中创建函数( 嵌套 函数或局部函数)

5、同样,Dart支持顶级变量以及绑定到类或对象(静态变量和实例变量)的变量。实例变量有时称为字段或属性。

6、与Java不同,Dart没有关键字publicprotectedprivate。如果标识符以下划线_开头,则它的库是私有的。

7、标识符可以以字母或下划线_开头,然后是这些字符和数字的任意组合。

变量

var name = "bob"
变量存储引用。名为name的变量包含对值bobString对象的引用。
name变量的类型被推断为String,但你可以通过指定它来更改该类型。如果对象不限于单一类型,可以指定dynamic类型。
dynamic name = "bob"
另外选择是显示声明将被推断的类型 :
String name = 'bob';

默认值

未初始化的变量的初始值为null。即使数字类型的变量最初也为空, 因为数字 - 就像Dart中的其他所有数据 - 都是对象。

int a ;
assert(a==null);

注意: assert()调用在生产代码中被忽略。 在开发过程中,除非条件为真,否则assert(condition)将引发异常。

Final和const

如果不打算改变一个变量,使用final或者const,而不是var或除一个类型。最终的变量只能设置一次。一个const变量是一个编译时常量。 (const变量隐含地是最终的。)最终的顶层或者类变量在它第一次被使用时被初始化。

final name ='bob' ;
final String name = 'bob';

注意:实例变量可以是final但不是const ;

const用于想要成为编译时常量的变量。如果const变量处于类级别则将其标记为static const ; 在声明该变量的位置,将该值设置为编译时常量,例如数字或字符串文字,常量变量或常数上算术运算的结果:

const bar =1;
const double atm =1*bar;
const关键字不仅用于声明常量变量。 也可以使用它来创建常量值 ,以及声明创建常量值的构造函数。 任何变量都可以有一个常量值。
//注意:[]创建一个空列表。 // const []创建一个空的不可变列表。
var foo = const []; // foo目前是空的不可变列表。
final bar = const []; //bar将永远是一个空的不可变列表。
const baz = const []; // baz是编译时常量空的不可变列表。

//你可以改变一个非final的非const变量的值,即使它曾经有一个const值。
foo = [];

//你不能改变final或const变量的值。
bar = []; // 未处理的异常。
baz = []; // 未处理的异常。

内置类型

Dart的基本数据类型如下:

1、numbers

2、strings

3、booleans

4、lists (arrays)

5、maps

6、runes

7、symbols

因为Dart中的每个变量都指向一个对象 - 一个类的实例 - 通常可以使用构造函数来初始化变量。 一些内置类型有自己的构造函数。 例如,可以使用Map()构造函数使用new Map()等代码创建Map

数字(number)

numbers有两种 :
1、 int : 整数值不大于64位,具体取决于平台。 在Dart VM上,值可以从-2^63到2^63 - 1。编译为JavaScript的Dart使用JavaScript编号,允许值从-2^53到2^53- 1。
2、double: 64位(双精度)浮点数,如IEEE 754标准所规定。
intdouble都是num子类型。num类型包含基本运算符,例如+,-,/和*; 并且还可以在其中找到abs()ceil()floor()等其他方法。 (
int是没有小数点的数字。
int x = 1;
int hex = 0xDEADBEEF;
如果一个数字包含一个小数,它是一个双精度数。
double y = 1.1;
double exponents = 1.42e5;
以下是将字符串转换为数字的方式,反之亦然:
// String -> int
var one = int.parse('1');
assert(one == 1);

// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

字符串

可以使用${expression}将表达式的值放入字符串中。 如果表达式是标识符,则可以跳过{}。 为了获得对应于对象的字符串,Dart调用对象的toString()方法。
var s1 = 1;

var s2 = "s1 : $s1";
注意:==运算符测试两个对象是否相同。 如果两个字符串包含相同的代码单元序列,则它们是等效的。
另一种创建多行字符串的方法:使用单引号或双引号的三引号:
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

布尔值

为了表示布尔值,Dart有一个名为bool的类型。只有两个对象具有类型booltruefalse,它们都是编译时常量。
Dart的类型安全意味着不能使用if (nonbooleanValue)assert (nonbooleanValue)
//布尔值
bool isGame = true;
assert(isGame);

 数组

几乎所有编程语言中最常见的集合可能是数组或有序对象组。 在Dart中,数组是List对象,因此大多数人只是将它们称为列表 。

var list = [1,2,3];

要创建一个编译时常量的列表,请在List前添加const

<div>var constantList = const [1,2,3];
// constantList [1] = 1; //取消注释会导致错误。</div>

 Map

一般来说,Map是将键和值相关联的对象。 键和值都可以是任何类型的对象。 每个键只出现一次,但可以多次使用相同的值。
var map = {
'first':"1",
'second':"2"
};//如果查找不在Map中的键,则返回空
var value = map["third"];
assert(value == null);//可以使用Map构造函数创建相同的对象
var map2 = Map();
map2["first"] = "100";

 函数

Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function 。 这意味着函数可以分配给变量或作为参数传递给其他函数。 也可以调用一个Dart类的实例,就像它是一个函数一样:

bool isNoble(int atomicNumber){
return _nobleGases [atomicNumber]!= null; }
虽然Dart建议使用公共API的类型注释 ,但如果省略这些返回类型,该函数仍然有效:
isNoble(atomicNumber){
return _nobleGases [atomicNumber]!= null; }
对于只包含一个表达式的函数,可以使用简写语法:
bool isNoble(int atomicNumber)=> _nobleGases [atomicNumber]!= null;
注意:箭头(=>)和分号(;)之间只能出现一个表达式 - 不包括语句 。 例如,你不能在那里放一个if语句 ,但你可以使用一个条件表达式 。

可选的参数

调用函数时,可以使用paramName:value指定命名参数。例如:
enableFlags(bold:true,hidden:false);
定义函数时,使用{param1,param2, …}来指定命名参数:
void enableFlags({bool bold,bool hidden}){

}

可选位置参数

在[]包装一组函数参数将它们标记为可选的位置参数:

String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;}

默认参数值

函数可以使用=来定义命名参数和位置参数的默认值。 缺省值必须是编译时常量。 如果未提供默认值,则默认值为null

void enableFlags({bool bold = false, bool hidden = false}) {
}

// bold为true; hidden为false.
enableFlags(bold: true);

main()函数

每个应用程序都必须具有顶层main()函数,该函数充当应用程序的入口点。 main()函数返回void并且有一个可选的List<String>参数用于参数。

void main() {
querySelector('#sample_text_id')
..text = 'Click me!'
..onClick.listen(reverseText);
}

函数作为参数

可以将一个函数作为参数传递给另一个函数:

void printElement(int element) {
print(element);}

var list = [1, 2, 3];
list.forEach(printElement);

匿名函数

大多数函数都被命名,例如main()printElement()。也可以创建一个名为匿名函数的无名函数,有时也可以创建一个lambdaclosure。可以将一个匿名函数分配给一个变量,例如,可以将其添加到集合中或从集合中删除它。
一个匿名函数看起来类似于一个命名的函数 - 零个或多个参数,用逗号和可选类型注释分隔,括号括之:
([[Type] param1[, …]]) {
codeBlock;
};
var list = ['apples', 'bananas', 'oranges'];
list.forEach(
(item) {
print('${list.indexOf(item)}: $item');
}
);
如果该函数只包含一条语句,则可以使用粗体箭头符号将其缩短:
var list = [0,1,2,3,4];

list.forEach(
(item) => print('${list.indexOf(item)}: $item')
);
void call(void callback(int)){
 callback(9999);
}

返回值

所有函数都返回一个值。 如果没有指定返回值,则语句return null; 会隐式地附加到函数体:

foo(){}

assert(foo()== null);

 

 

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00