Flutter - Dart 语言基础

变量

用 var 或者具体的类型来声明一个变量
当使用 var 定义变量时,表示类型是交由编译器推断决定的
未初始化的变量的值都是 null

常量

  • const,表示变量在编译期间即能确定的值
  • final 则不太一样,用它定义的变量可以在运行时确定值,而一旦确定后就不可再变
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    final name = 'Andy';
    const count = 3;

    var x = 70;
    var y = 30;
    final z = x / y; // 正确
    //const z = x / y; // 正确

    final time = new DateTime.now(); // 正确
    //const time = new DateTime.now(); // 错误

类型

numbers

  • num
  • int
  • double
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //整数
    int x = 123;
    int hex = 0xDEADBEEF;
    // 双精度数
    double y = 1.199;
    double exponents = 1.42e5;

    num z = 1.2

    // String 转为 int
    int one = int.parse('1');
    // String 转为 double
    double onePointOne = double.parse('1.1');
    // int 转为 String
    String oneAsString = 1.toString();
    // double 转为 String
    String piAsString = 3.14159.toStringAsFixed(2);

strings

Dart使用关键字String来表示字符串文字,字符串的值支持单引号或双引号方式。

1
2
String s1 = 'Single quotes work well for string literals.';
String s2 = "Double quotes work just as well.";

使用带有单引号或双引号的三引号创建多行字符串。

1
2
3
4
String s1 = '''
You can create
multi-line strings like this one.
''';

可以使用${expression}将表达式的值放在字符串中。如果表达式是标识符,则可以跳过{}。

1
2
3
4
5
6
7
8
9
10
String name = "王五";
String aStr = "hello,${name}";
print(aStr);

const int aConstNum = 0;
const bool aConstBool = true;
const String aConstString = 'a constant string';

const String constString = '$aConstNum $aConstBool $aConstString';
print(constString);

booleans

Dart中的布尔类型仅有false、true两个值,不能使用0、非0或者null、非null来表达false和true。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Check for an empty string.
var fullName = '';
print(fullName.isEmpty);

// Check for zero.
var hitPoints = 0;
print(hitPoints <= 0);

// Check for null.
var unicorn;
print(unicorn == null);

// Check for NaN.
var iMeantToDoThis = 0 / 0;
print(iMeantToDoThis.isNaN);

lists

在Dart中,数组是一个List对象。Dart中列表操作与JavaScript中的数组相似。

1
2
3
4
List list = [1, 2, 3];
List<String> list2 = ['one', 'two', 'three'];
// 创建一个编译时常量的列表
List constantList = const [1, 2, 3];

sets

Dart中的Set是无序的唯一项的集合

1
2
3
4
5
var test = {'chlorine', 'bromine', 'iodine', 'astatine'};
Set elements = <String>{};
elements.add('hello');
elements.addAll(test);
print(elements);

maps

1
2
3
4
5
6
7
8
9
10
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
//var gifts = Map<String, String>();
//gifts['first'] = 'partridge';
//gifts['second'] = 'turtledoves';
//gifts['fifth'] = 'golden rings';

runes

在Dart中,runes使用的是字符串的UTF-32代码点。Unicode为世界上所有书写系统中使用的每个字母,数字和符号定义唯一的数值。由于Dart字符串是UTF-16代码单元的序列,因此在字符串中表示32位Unicode值需要使用特殊语法。
在Dart中,String类有几个属性可用于提取runes信息。codeUnitAt和codeUnits属性返回16位代码单元。

1
2
3
4
5
6
7
8
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());

Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));

symbols

函数

1
2
3
4
5
6
7
String getUserInfo(String name, String sex, [String from = '中国']) {
var info = '$name 的性别是 $sex';
if (from != null && !from.isEmpty) {
info = '$info 来自$from';
}
return info;
}

运算符

流程控制语句

异常处理

面向对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class User {
String name;
int age;

User(this.name, this.age);
// User(String name, String age) {
// this.name = name;
// this.age = age;
// }
// 命名构造函数
User.fromJson(Map json) {
name = json['name'];
age = json['age'];
}
String say() {
return '我是${name},今年${age}岁';
}
}

泛型

异步支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import 'dart:io';
import 'dart:convert';

Future<String> get() async {
HttpClient httpClient = new HttpClient();
Uri uri = new Uri.https(
'api.bilibili.com', '/x/space/acc/info', {'mid': '4543111'});
HttpClientRequest request = await httpClient.getUrl(uri);
HttpClientResponse response = await request.close();
String responseBody = await response.transform(utf8.decoder).join();
httpClient.close();
return responseBody;
}
void main() async {
try {
final result = await get();
Map<String, dynamic> user = json.decode(result);
print(user['data']['name']); // 一条视频
} catch (e) {
}
}