在上一篇https://www.cnblogs.com/webor2006/p/11367345.html中咱们已经搭建好了Flutter的开发环境了,而Flutter的开发语言是选用的dart,那么要想把Flutter学得非常扎实,首先来把这门语言好好的学习是必须要做的,当然也有一种学习方法就是直接去学习各种效果,学着也很happy,但是!!!地基都打不牢何谈高楼大厦,所以摒弃浮躁,坚决从枯燥的基础一点点来。
纵览Dart语言【了解】:
什么是Dart?
为什么使用它?
Dart部分特性:
Dart重要概念:
Dart关键字【不用记,为了完整性贴出来而已】:
Dart内置库:
Dart类型系统:
基本数据类型:
Dart语法学习:
变量:
这块跟Java的还是有很大的区别的,所以接下来Dart的语言入门从如何定义一个变量开始。
变量的声明:
在Dart中声明变量主要有以下三种:
- var
- dynamic
- Object
那这三种有啥区别呢?下面直接用代码来实验出这三者的区别,咱们直接在上一次搭建flutter环境的第一个官方demo上进行编写:
咱们新建一个文件:
【感想】:对于搞Android的来说,真的很有必要学习一下它,官方推荐也就是用Android Studio来进行开发,不觉得搞Android的程序员学这门技术相当的顺其自然么?反正处于小白的我看到这个IDE就倍感亲切,坚定要学好它!!!
对于Dart的入口函数也是main,像Java、Kotlin都是嘛,好,咱们在main中来编写Dart变量:
此时它之后可以赋值任意的类型:
同样的,对于dynamic和Object都一样,对于未初始化之后都可以是任意类型,如下:
好,以上是声明了一个未初始化变量的三种声明的情况,接下来咱们再来看一下声明一下已初始化的变量的情况:
其它两种声明也类似,如下:
目前没看出它们之前有啥区别,接下来再看:
那此时看出来了var和dynamic、Object的区别了,那dynamic和Object有啥区别呢?下面再看:
总结如下:
var:如果没有初始值,可以变成任何类型。
dynamic:动态任意类型,编译阶段不检查类型。
Object:动态任意类型,编译阶段检查检查类型。
区别:
唯一区别 var 如果有初始值,类型被锁定。
默认值:
这里就不演示了,记住这个规则既可。
final和const:
共同点:
- 声明的类型可省略。
- 初始化后不能再赋值,跟java一样,就不多说了。
- 不能和var同时使用。
不同点:
- 类级别常量,使用static const,跟java一样,过。
- const可使用其他const 常量的值来初始化其值。
而如果引用变量类型的话则会报错了,如下:
- 使用const赋值声明,const可省略。
这个是Dart2之后的特性,以前是不能省略的,如下: - 可以更改非final、非const变量的值,即使曾经具有const值。
啥意思?下面看代码来理解:
那这样说其它两个也不能这样修改喽,试试:
但是如果对于list3由于它声明的是var,是可以重新改成一个新的数组的,如下:
其它两个肯定就不能这样来重新赋值了,如下:
- const导致的不可变性是可传递的。
这又是个什么东东,举例说明:
- 相同的const常量不会在内存中重复创建。
但是如果换成const再看打印:
- const需要是编译时常量。
而如果此时换成const就报错了:
由于我们给的是一个运行时常量所以就报错了,这个当时在学习JVM时有一个编译期常量和运行期常量,其概念差不多。
内置类型:
- Numbers 数值
比较简单,就不多说了。 - Strings 字符串
1、Dart 字符串是 UTF-16 编码的字符序列,可以使用单引号或者双引号来创建字符串。
2、可以使用三个单引号或者双引号创建多行字符串对象。
3、可以使用 r 前缀创建”原始raw”字符串。
这里来拓展个东东,之后还会学习的,对于StringBuffer应该不陌生,在Dart中来使用一下它:但是还可以链式来调用,如下:
有意思~~再来看个新语法:
随着之后的不断深入慢慢再来体会Dart这门语言的魅力之处吧~~
4、可以在字符串中使用表达式: ${expression},如果表达式是一个标识符,可以省略 {},如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串。
- Booleans 布尔值
记住一点:bool对象未初始化的默认值是null。这里看一个比较坑的地方:
其它使用基本上跟Java都差不多。
- Lists 列表(数组)
1、Dart中可以直接打印list包括list的元素,List也是对象。java中直接打印list结果是地址值
2、Dart中List的下标索引和java一样从0开始
3、和java一样支持泛型。
4、有增删改查,支持倒序,自带排序、洗牌,可使用+将两个List合并
下面来使用一下:那只添加1个呢?
居然还是会报错。。其实是因为如果固定长度的list只能通过这种方式来赋值了,如下:
其中List里面提供了很多方便的方法,随着之后的学习再不断了解既可,光练API没啥意思。
- Sets 集合
1、set1.difference(set2):返回set1集合里有但set2里没有的元素集合
2、set1.intersection(set2):返回set1和set2的交集3、set1.union(set2):返回set1和set2的并集
4、set1.retainAll():set1只保留某些元素(要保留的元素要在原set中存在)
- Maps 集合
跟java一样,就不多说了。 - Runes 符号字符
Runes用于在字符串中表示Unicode字符。
咱们来试一下:
使用String.fromCharCodes显示字符图形。
如果非4个数值,需要把编码值放到大括号中 - Symbols 标识符
Symbol标识符,主要是反射用,现在mirrors模块已经被移除,这里就不看了。
函数:
定义:
- Dart中函数是Function类型的对象。
- 所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null; 作为函数的最后一个语句执行。
- 定义函数时可省略类型(不建议)。
- 对于只有一个表达式的方法,你可以选择 使用缩写语法=>表达式来定义。(Kotlin是用=来实现)
- 可在函数内部定义函数,支持嵌套。
下面来用代码演示一下:
为啥上面的这个打印输出是null呢?是由于“所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null; 作为函数的最后一个语句执行” ,也就是对于这个add()函数,Dart会自动给咱们加上这句话:
咱们声明一个正常的函数,跟Java基本类似,如下:
最后再来看一个跟Java不一样的,但是跟Kotlin中差不多的语法:“对于只有一个表达式的方法,你可以选择 使用缩写语法=>表达式来定义”,下面来演示一下:
其函数体只有一句话,则可以写成这种形式:
这种写法在实际运用当中会大量用到。 另外对于函数内部还可以定义函数,演示一下:
具体这种写法有啥用目前还不知道,待未来用到时再来体会。。
可选参数:
先来看下理论:
- 可选命名参数:使用 {param1, param2, …} 的形式来指定命名参数。
其中如果这样调用会报错的:
- 可选位置参数:把可选参数放到 [] 中,必填参数要放在可选参数前面。
另外看个跟java不一样的东东,拓展下: - 可选命名参数默认值(默认值必须是编译时常量),可以使用等号‘=’或冒号’:‘。
- Dart SDK 1.21 之前只能用冒号,冒号的支持以后会移除,所以建议使用等号。
也可以用冒号:
但是冒号的方式使用是有风险的,这特性可能未来被未移除掉,所以。。建议统一用=号既可,也省得记第二种形式,也符合主观的使用感受。
- 可选位置参数默认值(默认值必须是编译时常量),只能使用等号'='。
- 可使用list或map作为默认值,但必须是const。
匿名函数:
- 可赋值给变量,通过变量调用。
先定义一个无参匿名:
也可以定义一个有参匿名,如下:
另外还有一种不太推荐的写法,了解一下既可,实际不这么用就成了:
- 可在其他函数中直接调用或传递给其他函数。
对于匿名的函数可以看一下系统的类,也是大量被应用了,举个例子:
咱们来使用一下:
闭包:
记得当时学Koltin时也有这个概念,记录于https://www.cnblogs.com/webor2006/p/11519284.html,那咱们来看一下对于Dart语言中的闭包是什么形态呢?
这个在未来读系统源码时都会遇到的,都是学得有用的,而不是无用的。
函数别名:
- typedef给函数起一个别名,使用比较方便。例如定义一个方法的回调,直接使用别名定义。
像c中有define宏定义,其实类似的效果,下面看下代码:
还可以将其做为函数的参数,如下:
- 没返回值,则只要参数匹配就行了,如果定义了返回值,则返回值不一样会报错。
操作符:
在Dart中的操作符有很多,大部分跟Java类似,也有Dart独有的,贴一张汇总表:
其中标红的则为跟Java不一样的,而标黑的则是一样的,对于一样的这里就不多说了,只看不同点:
- “?.”,条件成员访问 和 . 类似,但是左边的操作对象不能为 null,例如 foo?.bar 如果 foo 为 null 则返回 null,否则返回 bar 成员。
下面来看下代码:
而如果是Java的写法,安全判断应该是这样来写:
但是!!在Dart中有专门的语法来达到这样的效果,更加精简,如下:
比较好理解。
- “~/”,除后取整。
不多说。
- “as”,类型转换。
“is”,如果对象是指定类型返回true。
“is!”,如果对象是指定类型返回false。 - “??”,双问号左边为true返回左边结果,否则返回右边结果。
其实就是Java的三目运算符,看代码: - “..”,级联语法。严格来说, 两个点的级联语法不是一个操作符。 只是一个 Dart 特殊语法。
这个在之前已经用过了,回忆一下: - “??=”,如果左边是 null,则右边赋值给左边;如果不是 null,则左边的值保持不变。
流程控制语句:
这个跟Java的基本类似,主要有:
- if else
- for, forEach, for-in
- while , do-while
- break , continue
- switch case
咱们主要是看一下for-in,List和Set等实现了Iterable接口的类支持for-in遍历元素。下面瞅一下: