Dart学习笔记(一)

作为编写Flutter应用的工具语言,当然还是还是跑不掉的

Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type system 。 ——百度百科

由Google开发,Flutter基于Dart开发,并且在2018年,Dart2成为强类型语言,总的来说,它还比较新,目前对于它的了解仍停留在其是Flutter的**“工具语言”**

1. 程序的入口

至关重要的一点,程序的入口,与其他编程语言一样,Dart老实本分地遵循着传统,以main()作为起点

1
2
3
4
main() {
// 或者void main表示没有返回值
print('Hello Dart');
}

可以直接写成main()或者前面加上void表明其没有返回值

2. 注释

良好的注释对于所有程序员都很重要,包括自己

Dart中支持单行注释、多行注释以及文档注释

2.1. 单行注释

1
// 注释

这个用的最为频繁,对于各种方法、变量、语句都很适用,就像读书时加批注一样

2.2. 多行注释

1
2
3
/*
多行注释
*/

这个无非是多注释几行,如果需要描述的内容多一些可以用这个

2.3. 文档注释

1
2
3
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

像这个注释就比较规范了,通常用在声明类和文件时,总体描述作用时使用,最常见的就是在源码里面

总之,如果不确定在哪里用什么样的注释,源码总是最好的参考

image-20220410232524898

3. 变量

变量可以使用var进行定义

1
var str = ''; // 类型推断

编译器会根据初始化的值进行类型推断,这里会被推断为String

除此以外,也可以使用指定的类型进行声明

1
String s = '';

直接使用指定的类型声明为该类型的变量

4. 常量

Dart中,常量通常使用constfinal声明

使用const表示,可以直接替代var

1
const PI = 3.14; // 类型推导

直接使用const,编译器可以根据赋值进行类型推导

也可以直接加上具体类型

1
const String DATE_FORMAT = 'yyyy-MM-dd';

const声明的是编译期常量,即在程序开始运行之前,就进行赋值

final的使用方面同样也有两种

1
2
final now = new DateTime.now();  // 惰性初始化
final int length = 10;

但是尤其需要主要的是,final声明的常量可以接受函数调用,只有它可以获取运行时的量进行赋值,这也是其与const最大的不同

5. 数据类型

与其他各类编程语言如出一辙,Dart也需要丰富的数据类型给处理的数据分分类

5.1. 字符串

这绝对是最最最常用到的类型了

String用来表示字符串,直接可以使用String声明该类型的变量

1
String s2 = "";

单引号、双引号都可以,保持一种习惯较好

不过声明更加推荐的方式还是直接进行类型推导

1
var s1 = '';

除此以外,Dart还提供了使用'''"""括起来的写法,用来输出带有格式的字符串

1
2
3
4
5
  String s3 = '''
Hello,
World!
''';
print(s3);
image-20220411231011454

和预览的效果完全一致

字符串的拼接有两种,一种使用+

1
2
3
var s4 = 'Happy';
var s5 = ' Birthday!';
print(s4 + s5);

而另一种使用的是模板占位,运用$

1
print('$s4$s5');

使用这种方式先占位,程序会替换,与Kotlin的模板字符串完全一致,非常舒适

image-20220411231715184

5.2. 数值类型

主要分为整数与浮点

1
2
3
// 数值类型
int a = 123;
double b = 12.56;

整数使用int,小数使用double,简单粗暴,当然,同样推荐使用类型推导

另外,int可以直接赋值给double,反之不可

5.3. 布尔类型

没有太多可说的,bool定义,总共两个值:true和false

1
2
bool flag = true;
var mFlag = false; // 推导

5.4. List(数组/集合)

[]可以声明一个List,没有指定类型的情况下什么都可以往里放

1
2
var list1 = ['呱太', 666, false];
print(list1);

并且Listlength属性可以获取长度

1
print('长度=${list1.length}');

如果想要访问List中的元素,可以通过索引进行获取

和其他语言一样,索引从0开始

1
print(list1[0]);

可以使用<T>的方式为List中的元素限定类型

1
2
var list2 = <String>['阿凡提', '钢铁侠', '皮卡丘'];
print(list2);

这就不能自由发挥了,必须按照规矩办事

1
2
var list3 = []; // 空List
list3.add('Van'); // 增加数据

也可以先创建空的List,然后调用add()向其中填充元素,构建一个完整的List

1
2
3
4
// 创建一个固定长度的集合
var list4 = List.filled(3, 1); // growable属性为false,不可add,显示标明true可以add
// list4.add(5);
print(list4);

Java中,集合是可以动态增长的,而数组则是在声明时给定了容量

Listfilled(length, element)方法会初始化指定长度length的数组,里面的元素使用给定的element

这个方法返回的List是默认growable为false,也就是不可增长的

1
external factory List.filled(int length, E fill, {bool growable = false});

源码里能看到growable,如果显示设置为true,就会转变为先前几个List那样,可以动态增长,当然,不能增长,你猜add()会不会报错😏

1
2
// 修改非定长的集合的长度
list1.length = 1;

直接修改length默认会set(当然List得是能变的那种)

1
2
/// 注释的解释 如果新的长度更大,新元素会赋值null,注意当前类型是否允许空值
/// The list must be growable.

image-20220411234824911

5.5. Map(字典/映射表)

Map常用于二级列表

1
2
3
4
5
6
// Map 定义,类似于Json数据
var map1 = {
'name': 'minos',
'age': 18,
'hobbies': ['唱', '跳', 'rap', '魁地奇']
};

定义似乎和JS中的对象差不多,keyvalue可以指定任意类型,但key通常使用String

1
2
// 数据访问
print(map1['name']);

通过key来获取Map对象中与之对应的value

当一个key对应多个value就会产生分组的形式,也就二级列表

1
2
3
4
// 创建空的map并向其中添加元素
var map2 = Map();
map2['name'] = '伏地魔';
print(map2);

另外,调用Map()会创建一个空的Map实例,Dart2中省去了new关键字

直接通过给key赋值,就能添加对应数据,对应到keyvalue的关联关系

6. 类型判断

在编写代码时,有的时候只需要对关注的特定类型进行处理

这个时候就需要is来帮忙筛选一下

1
2
3
4
5
6
7
8
// 使用is关键字判断类型
// 尤其是服务器返回
var params = '';
if (params is String) { // 所期望的
print(params.length);
} else if (params is int) {
// int处理
}

我们没有把握,或者担心出错,可以保险一点,取数据时添加上类型判断,仅处理需要的,防止返回了意料之外的内容

只拿需要的,和考虑各种以外情况相比,自然是前者更简单