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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
The following is the data that you can add to your input file (as an example). Notice that the first line is going to be a line representing your own hobbies. In my case, it is the Vitaly,table tennis,chess,hacking line. Your goal is to create a class called Student. Every Student will contain a name (String) and an ArrayList<String> storing hobbies. Then, you will add all those students from the file into an ArrayList<Student>, with each Student having a separate name and ArrayList of hobbies. Here is an example file containing students (the first line will always represent yourself). NOTE: eventually, we will have a different file containing all our real names and hobbies so that we could find out with how many people each of us share the same hobby. Vitaly,table tennis,chess,hacking Sean,cooking,guitar,rainbow six Nolan,gym,piano,reading,video games Jack,cooking,swimming,music Ray,piano,video games,volleyball Emily,crochet,drawing,gardening,tuba,violin Hudson,anime,video games,trumpet Matt,piano,Reading,video games,traveling Alex,swimming,video games,saxophone Roman,piano,dancing,art Teddy,chess,lifting,swimming Sarah,baking,reading,singing,theatre Maya,violin,knitting,reading,billiards Amy,art,gaming,guitar,table tennis Daniel,video games,tennis,soccer,biking,trumpet Derek,cooking,flute,gaming,swimming,table tennis Daisey,video games,guitar,cleaning,drawing,animated shows,reading,shopping Lily,flute,ocarina,video games,baking Stella,roller skating,sudoku,watching baseball,harp Sophie,viola,ukulele,piano,video games
最新发布
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webor2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值