学习flutter必会的dart知识

学习flutter必会的dart知识

大伙都知道写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);
  });
}

编辑于 2018-07-16

文章被以下专栏收录