Fluter基础巩固之Dart语言详解<一>

在上一篇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遍历元素。下面瞅一下:

posted on 2019-12-03 10:24  cexo  阅读(1041)  评论(0编辑  收藏  举报

导航