大伙都知道写flutter的语言是dart,所以深入flutter前还是有一些dart的基础知识需要了解。 本文翻译自 如果不喜欢看中文请自行查看英文版。
下面是正文
很多人了解过,并且想深入研究flutter框架,在深入flutter框架前应该先对dart语言有所了解。dart本身非常好学,并且它像极了JavaScript,当然dart也有一些新的特性需要了解,以免在阅读和编写flutter代码时遇到困难。Google在dart官方网站上提供了dart的文档,非常详细,强烈建议大家阅读,链接,本系列教程只会涉及flutter用到的dart知识。
这意味着这个系列教程不会深入dart语言的方方面面,这些知识只会让你在读或者写flutter时不会再语言层面遇到太大的屏障。
Hello World
首先是经典的‘hello world’
main(List<String> args) {
print('Hello World');
}
和Java一样dart程序也有一个入口函数 main 把上面的程序保存为‘hello_world.dart’ 在命令行运行
dart hello_world.dart
变量声明
和JavaScript一样,可以用 var 关键字声明一个变量
main(List<String> args) {
var number = 42;
var name = 'Gurleen Sethi';
var salary = 150300.56;
var isDoorOpen = true;
}
在dart2里和JavaScript不一样的是,一旦给变量指定了类型就不可在改变了,dart是自带类型推断的。
可以在声明时明确的指明数据类型,如:
main(List<String> args) {
int number = 42;
String name = 'Gurleen Sethi';
double salary = 150300.56;
bool isDoorOpen = true;
}
如果变量不在改变可以声明为final或者const也就是常量
main(List<String> args) {
final int number = 42;
const String name = 'Gurleen Sethi';
//Omit explicitly defining data types
final salary = 150300.56;
const isDoorOpen = true;
}
final和const的不同是,const是编译时常量,也就是编译时就要有值,如const PI=3.14,而final只准许赋值一次,可以在编译时也可以在运行时。
数据类型
dart提供基本的数据类型:
- Numbers
- Strings
- Booleans
- Lists
- Maps
main(List<String> args) {
//Numbers
int x = 100;
double y = 1.1;
int z = int.parse('10');
double d = double.parse('44.4');
//Strings
String s = 'This is a string';
String backslash = 'I can\'t speak';
//String interpolation
String interpolated = 'Value of x is $x'; //Prints: Value of x is 100
String interpolated2 = 'Value of s is ${s.toLowerCase()}'; //Prints: Value of s is this is a string
//Booleans
bool isDoorOpen = false;
}
Lists
声明list用[],下面是list的一些基础操作:
main(List<String> args) {
var list = [1,2,3,4];
print(list); //Output: [1, 2, 3, 4]
//Length
print(list.length);
//Selecting single value
print(list[1]); //Outout: 2
//Adding a value
list.add(10);
//Removing a single isntance of value
list.remove(3);
//Remove at a particular position
list.removeAt(0);
}
不可变的常量list
main(List<String> args) {
var list = const [1,2,3,4]; //Cannot alter elements of this list
}
Maps
map的声明也非常简单,用{}
main(List<String> args) {
var map = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
};
//Fetching the values
print(map['key1']); //Output: value1
print(map['test']); //Output: null
//Add a new value
map['key4'] = 'value4';
//Length
print(map.length);
//Check if a key is present
map.containsKey('value1');
//Get entries and values
var entries = map.entries;
var values = map.values;
}
也可以用new构造函数声明
main(List<String> args) {
var squares = new Map();
squares[4] = 16;
}
常量map
main(List<String> args) {
var squares = const { //Cannot change the content of this map
2: 4,
3: 9,
4: 16,
5: 25
};
}
函数
和JavaScript一样,声明函数需要 函数名称,返回值和参数。
main(List<String> args) {
var name = fullName('John', 'Doe');
print(name);
}
String fullName(String firstName, String lastName) {
return "$firstName $lastName";
}
忽略返回类型也是可以的
main(List<String> args) {
var name = fullName('John', 'Doe');
print(name);
}
fullName(String firstName, String lastName) {
return "$firstName $lastName";
}
箭头函数的短写法也是支持的
main(List<String> args) {
var name = fullName('John', 'Doe');
print(name);
}
fullName(String firstName, String lastName) => "$firstName $lastName";
命名参数
Dart有一个特性叫命名参数,调用命名参数的函数时,必须指定每一个参数的名字。要启用命名参数功能,只需把所有的参数用大括号包裹起来就可以了,如
main(List<String> args) {
var name = fullName(firstName: 'John', lastName: 'Doe');
print(name);
}
fullName({String firstName, String lastName}) {
return "$firstName $lastName";
}
调用命名参数的函数时,如果没有指定参数的名字,程序会崩溃报错。
参数默认值
在命名参数里可以给参数指定一个默认值,这样某些参数就变成了可选参数,如下面的程序 lastName 就有一个默认的值
main(List<String> args) {
var name = fullName(firstName: 'John');
print(name);
}
fullName({String firstName, String lastName = "Lazy"}) {
return "$firstName $lastName";
}
函数是一等公民
在dart里可以用各种方法使用函数,例如,给函数传递函数
main(List<String> args) {
out(printOutLoud);
}
out(void inner(String message)) {
inner('Message from inner function');
}
printOutLoud(String message) {
print(message.toUpperCase());
}
这里定义了一个out函数,传入一个函数参数,调用时传入了printOutLoud,printOutLoud函数打印大写的字符串。 dart也可以使用匿名函数,所以上面的例子可以这么写
main(List<String> args) {
out((message) {
print(message.toUpperCase());
});
}
out(void inner(String message)) {
inner('Message from inner function');
}
另一个匿名函数的例子
main(List<String> args) {
var list = [1,2,3,4];
list.forEach((item) {
print(item);
});
}