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遍历元素。下面瞅一下:
Fluter基础巩固之Dart语言详解<一>的更多相关文章
- Fluter基础巩固之Dart语言详解<三>
继续Dart语言的学习,这次过后下次就进入全新的Flutter的学习了,小小的激动.. 操作符重载: C++中也有,咱们来看一下在Dart中是如何来实现的: 比较简单. 异步[重要!]: async和 ...
- Fluter基础巩固之Dart语言详解<二>
继续学习枯燥的Dart语言语法,目前的耐得住寂寞是为了将来学得“爽”做准备的!!! 异常: Dart 提供了 Exception 和 Error 类型, 以及一些子类型.还可以定义自己的异常类型.但是 ...
- 基础 | batchnorm原理及代码详解
https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...
- Java工程师 基础+实战 完整路线图(详解版)
Java工程师 基础+实战 完整路线图(详解版) Java 基础 Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装.继承.多态.此外还有泛型.反射 ...
- Docker 基础技术之 Linux cgroups 详解
PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 推荐大家到公众号阅读,那里阅读体验更好,也沉淀了很多篇干货. 前面两篇 ...
- 原来Github上的README.md文件这么有意思——Markdown语言详解(sublime text2 版本)
一直想学习 Markdown 语言,想起以前读的一篇 赵凯强 的 博客 <原来Github上的README.md文件这么有意思——Markdown语言详解>,该篇博主 使用的是Mac系统, ...
- 《Java基础——break与continue用法详解》
Java基础--break与continue用法详解 1. break语句: 规则: 1. 仅用于循环语句和switch语句当中,用于跳出循环. 2. 当只有一层循环时,则直接跳出循环,不 ...
- JavaEE基础(03):Http请求详解,握手挥手流程简介
本文源码:GitHub·点这里 || GitEE·点这里 一.Http协议简介 1.概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传 ...
- Java基础篇(JVM)——字节码详解
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...
随机推荐
- 关于对pei
我现在才开始整理这个不算晚吧...... 望轻喷 学习博客 我们需要四个程序 1.暴力 2.“正解” 3.数据生成器 4.检查程序 暴力: 就是暴力 eg: #include <cstdio&g ...
- vijos2055 移动金币
题目链接 思路 首先这是一个阶梯博弈. 我们将金币两两组合,如果对方移动前一个,那么我们把后一个移动相同的距离,局面相当于没有变化.如果对方移动后一个,就相当于\(NIM\)游戏中,取走了一些石子. ...
- 【HDU6327】Random Sequence(记忆化搜索)
点此看题面 大致题意: 给你两个序列\(a,v\),其中\(a\)数组由\(0\sim m\)组成.随机用\(1\sim m\)中的一个数替换\(a\)中的\(0\),求\(\sum_{i=1}^{n ...
- 状压DP(超详细!!!)
一.定义 总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式. 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用. 状压dp其实就是将状态 ...
- Ubuntu apache安装,配置,卸载
阿里云服务器等记得到控制台开启防火墙 安装 sudo apt-get update sudo apt-get install apache2 配置 apache2 默认的几个配置文件 /etc/apa ...
- SourceTree 免登录
SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subversion版本控制系统工具.支持 ...
- [转帖]腾讯云TStack获下一代云计算技术创新奖 与鲲鹏等产品实现兼容性测试
http://www.techweb.com.cn/cloud/2019-12-16/2769286.shtml [TechWeb]12 月 16 日消息,在中国电子技术标准化研究院主办的“第九届中国 ...
- Oracle高危安全漏洞:具有查询权限用户可绕开安全限制进行数据修改
数据库版本 11.2.0.* 检查数据库是否存在此bug的脚本: Oracle用户执行此脚本 #!/bin/bash # Usage: 检查ORACLE数据库是否存在高危安全漏洞(具有查询权限用户可绕 ...
- SpringCloud 别人的主页
https://www.cnblogs.com/xuwujing/ java(28) springBoot(14) 设计模式(14) springcloud(7) hadoop(7) hive(5) ...
- Blend 触发器
原文:Blend 触发器 介绍用定义触发器来控制视频 的 开始 暂停 继续 停止 触发器设置 效果