不讲理论,代码实践

一、基本变量类型

dart 以 main 函数作为执行入口,虽然不强制类型,但是建议使用强制类型来使用,编译器不需要去推导类型:

如果使用 var 声明变量,则不会进行类型约束

void main() {

}

1、 变量声明 & console 输出 & 字符串拼接 & 数字转字符串

  print('hello world!');
  var firstName = 'post';
  String lastName = 'bird';
  var age = 122;
  print(firstName + lastName + ' , age is ' + age.toString());


  var name = 'ptbird';
  name = 123.toString();
  int num = 3;
  double num2 = 0.111;
  print( num ++ );
  print( ++ num );
  print(num2 / num);

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
hello world!
postbird , age is 122
3
5
0.0222

2、const 变量和 final 变量声明

const 只能通过静态数据赋值,否则会报错

  const lastName = 'postbird';
  final firstName = 'bird  ';
  // lastName = '123';  // 报错
  // firstName = '123'; // 报错
  final time = new DateTime.now();
  // const time2 = new DateTime.now(); // 报错

输出结果(无输出)


[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"

[Done] exited with code=0 in 1.167 seconds

如果给 final 或者 const 再次赋值了,则会报错如下:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
demo1/demo1.dart:20:3: Error: Setter not found: 'lastName'.
  lastName = '123';
  ^^^^^^^^

[Done] exited with code=254 in 2.262 seconds

如果给 const 赋值非 const 变量,则报错如下:

 // const time2 = new DateTime.now(); // 报错
[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
demo1/demo1.dart:23:17: Error: New expression is not a constant expression.
  const time2 = new DateTime.now();
                ^^^

[Done] exited with code=254 in 2.992 seconds

3、String 字符串换行和字符串拼接

1)换行 ''' '''

  String content = '''
    multipart
    ...
    string
  ''';  
  print(content);

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
    multipart
    ...
    string

2)字符串拼接

拼接除了使用加好,还可以像 js 的模板字符串直接拼接,语法差不多,只不过不需要反引号,普通引号即可,${v},其中如果只是变量名,可以省略大括号 $v

  String str1 = 'dart1';
  String str2 = 'darg2';
  int age = 21;
  print('$str1   $str2  ${age.toString()}');
  print('${str1}   ${str2}  ${age.toString()} ${age} ${age * age}');

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
dart1   darg2  21
dart1   darg2  21 21 441

[Done] exited with code=0 in 2.336 seconds

4、int 和 double 数字 整形和浮点型

  int num1 = 123;
  double price = 123.452323232;
  print(price * num1);
  price = 12;
  print(price * num1);

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
15184.635757536
1476.0

[Done] exited with code=0 in 2.772 seconds

5、bool 类型和 if 判断

if 判断只能是 bool 类型的返回值,这点和 js 这衶弱类型语言完全不同:

  bool flag = true;
  if(flag) {
    print('--- true');
  }
  int num1 = 1;
  double num2 = 1.0;
  String num3 = '1';
  if(num1 == num2) {
    print('num1 == num2');
  } else {
    print('num1 != num2');
  }
  if(num1 == num3) {
    print('num1 == num3');
  } else {
    print('num1 != num3');
  }
  // int a = 1;
  // if(a) {  // 报错
  //   print('true');
  // }

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
--- true
num1 == num2
num1 != num3

[Done] exited with code=0 in 1.452 seconds

如果 if 使用了非 bool 类型判断报错如下:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
demo1/demo1.dart:65:6: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
Try changing the type of the left hand side, or casting the right hand side to 'bool'.
  if(a) {
     ^

[Done] exited with code=254 in 1.974 seconds

6、List 类型

List 类型是使用非常多的类型,与 js 的 Array 类似,初始赋值可以直接给一个列表,也可以通过 new List() 指定空的列表.

默认列表子项支持的值类型是 dynamic,不限制具体类型,如果需要限制具体类型则需要使用泛型,比如 new List<String>() 限制子项类型

List 作为对象提供了一些的方法和属性: API 文档地址: https://api.dart.dev/dev/2.4.0-dev.0.0/dart-core/List-class.html

通过 add() 能够添加一个子项, 通过 addAll() 能够追加另一个 List

  List l1 = [123, '123', 'postbird'];
  print(l1);
  List l2 = new List();
  l2.add('abc');
  l2.add(123);
  l2.addAll(['iterable', '222', '333', 123]);
  print(l2);
  List l3 = new List<String>();
  l3.add('abc');
  // l3.add(123);
  print(l3);
  List l4 = new List<int>();
  l4.add(123);
  // l4.add(123.12);
  print(l4);
  List l5 = new List<int>();
  l5.add(1);
  l5.add(3);
  l5.add(2);
  l5.add(4);
  l5.add(6);
  l5.add(2);
  print(l5);
  l5.sort();
  print(l5);

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
[123, 123, postbird]
[abc, 123, iterable, 222, 333, 123]
[abc]
[123]
[1, 3, 2, 4, 6, 2]
[1, 2, 2, 3, 4, 6]

[Done] exited with code=0 in 2.079 seconds

7、Map 类型

与 javascript 对象类似,在 oc 中称为字典。

可以通过字面量指定,也可以通过声明一个 new Map() 的空 Map。

API 文档地址:https://api.dart.dev/dev/2.4.0-dev.0.0/dart-core/Map-class.html

  var person = {
    'name': 'ptbird',
    'age': 24,
    'work': ['it1', 'it2']
  };
  print(person);
  print(person.toString());
  print(person['name']);
  print(person['age']);
  print(person['work']);
  Map person2 = new Map();
  person2['name'] = 'name2';
  person2['age'] = 24;
  person2['work'] = ['it1', 'it2'];
  print(person2);
  print(person2['work']);

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
{name: ptbird, age: 24, work: [it1, it2]}
{name: ptbird, age: 24, work: [it1, it2]}
ptbird
24
[it1, it2]
{name: name2, age: 24, work: [it1, it2]}
[it1, it2]

[Done] exited with code=0 in 1.584 seconds

8、类型判断

is 操作符能够判断类型归属,比如 A is B,能够返回 bool 类型,判断 A 是否属于 B 类型。

  var value = 123;
  if(value is String) {
    print('${value} is string');
  } else if (value is int) {
    print('${value} is int');
  } else if (value is double) {
    print('${value} is double');
  } else {
    print('${value} is other type');
  }

输出结果:

[Running] dart "e:\Aprojects\DartHelloWorldDemo\demo1\demo1.dart"
123 is int

[Done] exited with code=0 in 1.567 seconds