本篇基于Dart 3.1.5版本进行学习
在正式进入Flutter学习之前,我们先要了解它的Dart语言,本篇主要介绍Dart语言的基本类型、列表类型、和别名知识,希望通过文章帮助大家了解和巩固Dart开发的基石。
基础类型
Dart中基础类型相对于Java还是少了很多的,数字类型只有int和double,字符串类型只有String,布尔类型则为bool,在Dart中还有种特殊的类型为Record,名为记录,是一种匿名的、不可变的、聚合类型,下面会单独介绍此中类型的用法。
数字类型
ini
int i = 1;
print("int i: $i");
double d = 1.23;
print("double d: $d");
int和double都是最最基础的数字类型,int为整数,double为浮点数,double表示的是标准的64位浮点数,可使用double.maxFinite
获取最大值。
int和double都是可以使用to**()
进行互转,并且可以转为String类型。
字符串类型
ini
String s = "Hello Dart";
print("string s: $s");
Dart中只有String字符串类型,没有实际的char字符类型,但是可以使用String.chodUnitAt(index)
获取到指定下标的UniCode编码值,然后可以通过String.fromCharCode(int)
方法将UniCode值转换为String类型。此操作只是为了展示Char的一种获取方式,实际开发中按需使用哦~
布尔类型
ini
bool b = false;
print('bool b: $b');
Dart中布尔类型采用的是bool关键字来表示,使用比较简单这里就不过多介绍。
记录类型
Dart在3.0版本的时候推出了Record类型,它表示的是一种匿名的、不可变的、聚合类型,有点类似于集合的概念,但有不完全是,它定义的值不可改变,并且值的类型可以定义多种类型,下面来看看具体是如何使用Record类型。
dart
var record = ('first', a: true, 'last');
print('record: $record');
print('record a: ${record.a}');
print('record 1: ${record.$1}');
print('record 1: ${record.$2}');
输出:
record: (first, last, a: true)
record a: true
record 1: first
record 1: last
Record类型定义的方式是()
形式,值中间以,
分割,可以定义单个值,也可以定义键值对形式的值,但是这些值在定义完之后都不可以改变。
对于键值对的值可以采用record.key
来获取对应key的值,而单个值的获取则需要采用record.$index
这种形式来获取对应的值。
Record相比于class或者map来说,维护一个不变的数据更加的方便,但是如果你要维护的数据随时都需要改变其中的值,那么Record可能就不适合这种场景了。
集合类型
了解了Dart中基本的数据类型之后,接下来我们再学习下Dart中集合的数据类型,在集合类型中Dart和Java还是比较相似的,都是提供了List、Set和Map这三种集合类型。
List集合
dart
const list = [1, 2, 3];
print('List: $list');
for (var value1 in list) {
print('List value: $value1');
}
输出:
List: [1, 2, 3]
List value: 1
List value: 2
List value: 3
这是一个常规定义的List对象,for循环可以遍历List中每一个对象元素。
在Dart中List有几种非常骚气的操作,它可以直接将另外一个List在定义的阶段直接引入到自身元素中。
ini
const newList = [4, ...list];
print('NewList: $newList');
输出:
NewList: [4, 1, 2, 3]
这里定义了newList对象,首元素为4,后面直接通过...List
这种形式将上面定义好的list对象引入到当前结合中,此时newList集合元素就变成了4,1,2,3。...List
和List.addAll()
方法具有相同的效果,但是...List
使用时机是在定义阶段。
下面再来看一种直接在定义阶段使用控制流操作来自定义元素的操作:
ini
var age = 10;
var operatorList = [1, 2, 3, if (age > 10) 10, if (age <= 10) 0];
print('operatorList: $operatorList');
输出:
operatorList: [1, 2, 3, 0]
在定义operatorList的时候,第四个元素使用if表达式控制是否定义10这个元素,第五个元素则和第四个元素的控制条件相反,因为上面age定义的为10,所以operatorList最终的元素为1,2,3,0,因为第四个元素10不满足条件未被添加到集合中。
这种控制流操作在日常开发中作用还是挺大的,我们可以直接在定义阶段使用控制流管理元素。
Set集合
dart
const set = {1, 2, 3};
set.forEach((element) {
print('Set value: $element');
});
输出:
Set value: 1
Set value: 2
Set value: 3
Set和List相似,唯一的不同点就是set不可以添加相同的元素。Set和List可以通过toSet()
和toList()
方法进行互转
Map集合
go
const map = {"name": "tao", "age": 1};
map.forEach((key, value) {
print('map key: $key, value: $value');
});
Map是一种键值对形式的集合,天然支持forEach()遍历Map中每一个key和value。
对于List小节中 ...List
和控制流用法在Set和Map中也是支持的。
别名类型
别名类型在kotlin中也是有的,kotlin中的typealias
就是Dart中的typedef
,都是为了给某一个对象单独定义一个别名,方便后续开发使用,代码如下:
ini
typedef IntList = List<int>;
void main(){
IntList intList = [1, 2, 3];
IntList intList1 = [1, 2, ""]; // error:The element type 'String' can't be assigned to the list type 'int'. (Documentation)
}
这里需要了解的是typedef只可以定义在文件的顶层,也就是说不可以定义在任何方法和类之中。
上面我们定义了一个IntList别名,表示的是整数型列表,然后在使用IntList别名的时候列表元素只可以赋值整数,intList1对象在赋值字符串时直接报错了。
除了定义别名对象外,还有一种比较常见和适用的场景,就是定义回调方法,比如一个最简单的回调void Function()
每次都需要这么写显得很繁琐,这时候就可以使用typedef来帮助我们简化代码了。
dart
typedef CommonCallback = void Function();
typedef OnSuccess = void Function();
typedef OnFailure = void Function(String error);
这样给回调方法定义别名后,在后续使用中直接采用别名定义,既简化了代码也增加了可读性,一眼就只到此回调的具体作用。
写在最后
本篇文章是Dart中最基础的一部分,希望可以帮助大家了解和巩固下Dart的基础知识,后续会循序渐进逐步接触Dart更多的知识。
我是Taonce,如果觉得本文对你有所帮助,帮忙关注、赞或者收藏三连一下,谢谢😆😆~