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

  • 相关阅读:
    Eclipse_debug异常_Source not found
    Mybatis异常_01_Invalid bound statement (not found)
    [转]Eclipse快捷键_01_常用快捷键汇总
    PL/SQL学习笔记_03_存储函数与存储过程
    PL/SQL学习笔记_02_游标
    PL/SQL学习笔记_01_基础:变量、流程控制
    Oracle学习笔记_05_分组函数
    博客园_01_为博客园添加目录的方法总结
    Oracle学习笔记_04_多表查询
    Oracle学习笔记_03_单行函数
  • 原文地址:https://www.cnblogs.com/webor2006/p/11975291.html
Copyright © 2020-2023  润新知