Dart学习笔记(一)
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 | main() { |
可以直接写成main()
或者前面加上void
表明其没有返回值
¶2. 注释
良好的注释对于所有程序员都很重要,包括自己
Dart
中支持单行注释、多行注释以及文档注释
¶2.1. 单行注释
1 | // 注释 |
这个用的最为频繁,对于各种方法、变量、语句都很适用,就像读书时加批注一样
¶2.2. 多行注释
1 | /* |
这个无非是多注释几行,如果需要描述的内容多一些可以用这个
¶2.3. 文档注释
1 | // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
像这个注释就比较规范了,通常用在声明类和文件时,总体描述作用时使用,最常见的就是在源码里面
总之,如果不确定在哪里用什么样的注释,源码总是最好的参考
¶3. 变量
变量可以使用var
进行定义
1 | var str = ''; // 类型推断 |
编译器会根据初始化的值进行类型推断
,这里会被推断为String
除此以外,也可以使用指定的类型进行声明
1 | String s = ''; |
直接使用指定的类型声明为该类型的变量
¶4. 常量
在Dart
中,常量通常使用const
和final
声明
使用const
表示,可以直接替代var
1 | const PI = 3.14; // 类型推导 |
直接使用const
,编译器可以根据赋值进行类型推导
也可以直接加上具体类型
1 | const String DATE_FORMAT = 'yyyy-MM-dd'; |
const
声明的是编译期常量,即在程序开始运行之前,就进行赋值
final
的使用方面同样也有两种
1 | final now = new DateTime.now(); // 惰性初始化 |
但是尤其需要主要的是,final
声明的常量可以接受函数调用,只有它可以获取运行时的量进行赋值,这也是其与const
最大的不同
¶5. 数据类型
与其他各类编程语言如出一辙,Dart
也需要丰富的数据类型给处理的数据分分类
¶5.1. 字符串
这绝对是最最最常用到的类型了
String
用来表示字符串,直接可以使用String
声明该类型的变量
1 | String s2 = ""; |
单引号、双引号都可以,保持一种习惯较好
不过声明更加推荐的方式还是直接进行类型推导
1 | var s1 = ''; |
除此以外,Dart
还提供了使用'''
或"""
括起来的写法,用来输出带有格式的字符串
1 | String s3 = ''' |
和预览的效果完全一致
字符串的拼接有两种,一种使用+
1 | var s4 = 'Happy'; |
而另一种使用的是模板占位,运用$
1 | print('$s4$s5'); |
使用这种方式先占位,程序会替换,与Kotlin
的模板字符串完全一致,非常舒适
¶5.2. 数值类型
主要分为整数与浮点
1 | // 数值类型 |
整数使用int
,小数使用double
,简单粗暴,当然,同样推荐使用类型推导
另外,int
可以直接赋值给double
,反之不可
¶5.3. 布尔类型
没有太多可说的,bool
定义,总共两个值:true和false
1 | bool flag = true; |
¶5.4. List(数组/集合)
[]
可以声明一个List
,没有指定类型的情况下什么都可以往里放
1 | var list1 = ['呱太', 666, false]; |
并且List
的length
属性可以获取长度
1 | print('长度=${list1.length}'); |
如果想要访问List
中的元素,可以通过索引
进行获取
和其他语言一样,索引从0开始
1 | print(list1[0]); |
可以使用<T>
的方式为List
中的元素限定类型
1 | var list2 = <String>['阿凡提', '钢铁侠', '皮卡丘']; |
这就不能自由发挥了,必须按照规矩办事
1 | var list3 = []; // 空List |
也可以先创建空的List
,然后调用add()
向其中填充元素,构建一个完整的List
1 | // 创建一个固定长度的集合 |
在Java
中,集合是可以动态增长的,而数组则是在声明时给定了容量
List
的filled(length, element)
方法会初始化指定长度length
的数组,里面的元素使用给定的element
这个方法返回的
List
是默认growable为false,也就是不可增长的
1 | external factory List.filled(int length, E fill, {bool growable = false}); |
源码里能看到growable
,如果显示设置为true,就会转变为先前几个List
那样,可以动态增长,当然,不能增长,你猜add()
会不会报错😏
1 | // 修改非定长的集合的长度 |
直接修改length
默认会set
(当然List
得是能变的那种)
1 | /// 注释的解释 如果新的长度更大,新元素会赋值null,注意当前类型是否允许空值 |
¶5.5. Map(字典/映射表)
Map
常用于二级列表
1 | // Map 定义,类似于Json数据 |
定义似乎和JS中的对象差不多,key
和value
可以指定任意类型,但key
通常使用String
1 | // 数据访问 |
通过key
来获取Map
对象中与之对应的value
当一个key
对应多个value
就会产生分组的形式,也就二级列表
1 | // 创建空的map并向其中添加元素 |
另外,调用Map()
会创建一个空的Map
实例,Dart2
中省去了new
关键字
直接通过给key
赋值,就能添加对应数据,对应到key
和value
的关联关系
¶6. 类型判断
在编写代码时,有的时候只需要对关注的特定类型进行处理
这个时候就需要is
来帮忙筛选一下
1 | // 使用is关键字判断类型 |
我们没有把握,或者担心出错,可以保险一点,取数据时添加上类型判断,仅处理需要的,防止返回了意料之外的内容
只拿需要的,和考虑各种以外情况相比,自然是前者更简单