# 数据类型

基本的类型:

  • 数字(number)
  • 字符串(string)
  • 布尔值(boolean)
  • 列表(list)
  • 集合(set)
  • 映射(map)
  • 符文(rune)
  • 符号(Symbol)

# 数值型

Dart 中数字类型用于表示数字文字,Dart 中的数字类型分为整数和双精度数两种,整数值不大于64位, 具体取决于平台。

你可以使用 int / double 关键字来显式声明一个整型 / 双精度变量:

int a = 10;
int b = 0xDEADBEEF;
double c = 3.14;
double d = 1.42e5;

另外,Dart 支持自动推断数据类型,所以你也可以像JS一样使用 var 关键字来声明:

var a = 88;
var b = 5.65;

同时num也支持一些数据类型的转换:

void main() {
  var age = '18';
  print(age.runtimeType); //输出:String 类型

  int parseAge = int.parse(age);
  print(parseAge.runtimeType); //输出:int 类型
}

# 字符串

Dart字符串是UTF-16编码的字符序列,可以使用单引号或者双引号来创建字符串,单引号和双引号可以嵌套使用,否则需要使用\进行转义。

字符串中也可以引用变量与表达式,同时可以实现字符串拼接功能

import 'dart:core';

void main() {
  var name = 'toimc';
  print(name.runtimeType); //输出:String 类型

  var newName1 = "my name is $name";
  print(newName1); //输出:my name is toimc

  //和上面反之,需要添加上{}
  var nameName2 = "my name is ${User().name}";
  print(nameName2); //输出:my name is toimc
}

class User {
  var age =10;
  var name ="toimc";
}

提供一个 r 前缀可以创建一个 “原始 raw” 字符串,说白了就是不需要转义(如果添加上转义字符那么将会失效)如下:

import 'dart:core';

void main() {
  //r:不需要转义
  print(r"换行符: \n"); //输出:换行符:\n
  print("换行符: \\n"); //输出:换行符:\n
}

# 布尔型

Dart有个类型名字为bool 类型,而在Dart中只有两个对象是布尔类型:分别是true和false。在Dart中还强类型检查,只有当为true的时候才会真。

import 'dart:core';

void main() {
 bool isLoading;
 print('$isLoading'); //输出:null;
 
 isLoading =true;
 print('$isLoading'); //输出:true;
}

#

# 列表List

几乎所有的编程语言中数组是必不可少的,而在Dart中 list 也是必不可少的。

下面我们来看一下List一些基本用法:

  • 初始化
import 'dart:core';

void main() {
  var names = List();
  print(names.length); //输出:0;

  var names1 = List(2);
  print(names1.length); //输出:2;
  
  //如果想要为 List 添加不同数据类型的变量,则需要直接只买数据类型为Object
  var names2 = List<Object>();
  names2.add('toimc');
  print(names2.runtimeType); //输出:List<Object> 类型
  
  //直接复制,可以添加不同类型
  var names3 = ['toimc',12,11.0];
  print(names3.length); //输出:3
  
  //在list 字面上之前添加const 关键字,可以定义一个不变的list对象(编译是常量)
  var names4 = const[1,2,3];
  print(names4.length); //输出:3
  ///如果为names4集合添加一个值如下操作,这种操作是错误,list不可变
  ///报错:Cannot add to an unmodifiable list
  names4.add(4);
}
  • 常用属性和方法
import 'dart:core';

import 'package:myfirstflutter/test/user.dart';

void main() {
  var names1 = [1, 2, 3];
  print(names1.length); //输出:0;

  //排序
  List<User> myList = [User('toimc', 23), User('小方', 61), User('小李', 48)];
  myList.sort((a, b) => (b.age).compareTo(a.age));

  //集合循环
  myList.forEach((v) {
    print('${v.name}${v.age}'); //输出:小方61,小李48,toimc23
  });

  //查找符合条件
  var result = myList.where((v) => v.age == 23);
  result.forEach((v){
    //isEmpty属性,返回列表是否为空
    print('${v.name}${v.age}');
  });
  //isEmpty属性,返回列表是否为空
  print(myList.isEmpty);

  //isNotEmpty属性,返回列表是否有元素
  print(myList.isNotEmpty);
  
  //获取List中的第一个元素
  print("获取List中第一个元素${names1.first}");
}
  • 添加数据
import 'dart:core';

void main() {
  var names1 = ['小李', '小王', '小张'];
  //添加数据
  names1.add('李四');
  print(names1.length); //输出:4;

  var names2 = List(2);

  ///当执行add 时候会报错:Cannot add to a fixed-length list
  ///(固定长度的list是不能通过add添加数据)
  ///names2.add(1);

  //固定长度的list使用一下方式可以设置数据
  names2[0] = 'toimc';
  names2[1] = '小方';
  names2.forEach((v) {
    print('$v'); //输出:toimc 小方
  });

  var names3 = ['小李', '小王', '小张'];
  var names4 = ['1', '2', '3'];
  //添加全部元素
  names3.addAll(names4);
  names3.forEach((v) {
    print('$v'); //输出:小李 小王 小张 1 2 3
  });
}
  • 删除数据
import 'dart:core';

void main() {
  var names1 = ['小李', '小王', '小张', '李四', 'toimc'];
  //删除指定元素
  names1.remove('小李');
  print(names1); //输出:小王 小张 李四 toimc

  //删除最后一个元素
  names1.removeLast();
  print(names1); //输出:小王 小张 李四

  //删除指定位置元素
  names1.removeAt(names1.length - 1);
  print(names1); //输出:小王 小张

  //删除指定位区域元素
  names1.removeRange(0, 1);
  print(names1); //输出 小张

  //下面这个方法是将列表List中的toString只有的字符串的长度等于3的元素全部删除
  names1.removeWhere((item) =>item.toString().length==3);
  print('删除列表中toString后长度为3的元素:==>$names1');
}

# Map

Map和lList一样基本上只要学习开发语言map也是必不可少的一部分,特点:

  • Map是键值对相关的对象;

  • 键和值可以是任何类型的对象;

  • 每个键只出现一次, 而一个值则可以出现多次。

import 'dart:core';

void main() {
  //直接声明,用{}表示。里面写key和value 每组键值对中间用逗号隔开
  var names = {'name1': '小李', 'name2': '小王', 'name3': '小张'};
  print(names); //输出:{name1:小李,name2: 小王, name3:小张}

  var names1 = Map();
  names1['name1'] = '小方';
  names1['name2'] = '小李';
  names1['name3'] = 'toimc';
  print(names1); //{'name1': '小方', 'name2': '小李', 'name3': 'toimc'};

  //限定Map 可以存储的数据类型
  var names2 = <String, String>{'name': '小李'};
  print(names2); //输出:{'name':'小李'}

  //与list List类似,要创建一个编译时常量的Map需要在Map的字面量前加上const 关键字
  var names3 = const {'name': '小李', 'age': 60};
  print(names3); //输出:{'name':'小李','age' : 60}

  //循环
  names1.forEach((k, v) {
    print(v); //输出:小方,小李。toimc
  });

  //查询删除
  var names4 = {'name1': '小李', 'name2': '小王', 'name3': '小张'};
  names4.removeWhere((k, v) => k == 'name1');

  names4.forEach((k, v) {
    print(v); //输出:小王,小张
  });

  //根据指定key 进行删除
  names4.remove('name1');
  //找找是否包含指定key
  names4.containsKey('name2');

  //找找是否包含指定value
  names4.containsValue('小张');

  //添加一个Map对象
  names4.addAll({'name': '丘处机'});
}

Map和List一样,同样有增删改查功能