Dart 初探 (一)
前言
Dart 是 Google 为 Flutter 开发的一款用于网页编程的语言,其类似于Javascript,也是一种面向对象的语言,但其采用基于类的编程,语法风格接近C语言。
虽说它是开发用于网页编程的,但它也可以开发命令行应用,甚至可以用于开发移动端应用,如 Flutter 就是一款基于 Dart 语言、用于移动端开发的跨平台开发套件。本篇文章的目的是先简单了解下 Dart 语言基础,为以后的 Flutter 开发做准备。
开始:创建一个 Dart 项目
使用VS Code,安装 Dart 扩展:

创建 Dart 项目:
Ctrl + Shift + P打开命令面板,输入dart

点击 Dart: New Project,选择第二项 Console Application

之后选择一个新项目所在路径,VS Code 就会自动创建一个示例项目。
点击 main() 方法上方的 Run 按钮,就可以运行项目代码:

可以看到,Dart 项目输出了结果。
基本语法:变量声明
变量 var 关键字
// var 变量, 可接受任何类型变量,
// 一但赋值类型无法修改——强类型语言,具有类型的概念
var t = "hi world";
print(t);
//t = 1000; 修改会导致编译失败
t = "hello world"; //可重新赋值
print(t);
根基类 Object 和 变量 dynamic 关键字
Object是 Dart 所有对象的根基类,也就是说在 Dart 中所有类都是Object的子类(包括Function和Null)dynamic声明的对象编译器会提供所有可能的组合,因此编译时可能不会报错,但在运行时可能会产生报错——运行时错误Object声明的对象只能使用Object的属性与方法,否则编译器会报错// dynamic 变量
// 与var 不同, 赋值后类型可以修改
dynamic tt;
tt = "cool guy";
print(tt);
tt = "cool boy"; //可重新赋值
print(tt);
tt = 10086; //也可赋值为其他类型
print(tt);
//提供可能的内部方法的组合,编译时不会报错,
//但对象的属性或方法不存在时运行时会报错
print(tt.length); // Object 类
// 所有 对象的根基类, 任何类型均可赋值给Object对象
Object o = "ohhhhh!";
print(o);
o = 5201314; //可重新赋值,可赋值为其他类型值
print(o);
//print(o.length); //只能使用Object对象的方法,否则编译器会报错
变量 final 和 const 关键字
如果打算声明一个不改变的变量值,使用final 或 const
const变量是一个编译时常量(编译时直接替换为常量值)final变量在第一次使用时被初始化
// final 变量
final str = "This is a final str";
// 在第一次使用时被初始化
print(str);
// str = "This is an another final str"; 重新赋值编译器会报错
// const 编译时常量
// 编译时被替换为常量值
const str2 = "This is a const str";
print(str2);
//str2 = "This is an another const str"; 重新赋值编译器会报错
空安全
- 不可空类型使用前必须初始化,可空类型使用前必须判空
- 预期变量不能为空,但在定义时不能确定其初始值,则可以加上
late关键字,表示会稍后初始化,但是在正式使用它之前必须得保证初始化过了,否则会报错 - 可空类型的变量,在某些情况下即使我们给它赋值过了,但是预处理器仍然有可能识别不出,这时我们就要显式(通过在变量后面加一个”!“符号)指定其不为
null - 可空类型的函数变量,使用
?.call()进行调用,表示不为空时调用函数
// 空安全
int a; //默认为不可空类型,必须在使用前初始化
//print(a * 7); // 在初始化前使用时, 编译器会报错
int? b; // 可空类型
if (b != null) {
print(b * 7); // 可空类型在使用时, 必须先判空
}
// late 关键字, 延迟初始化
late int k;
k=9;
// 使用! 显示指定不为null
var s = k! * 9;
// 函数变量使用?.call() 非空时调用
fun?.call()
进阶语法:函数
函数式编程
Dart 作为一种真正的面向对象的语言,即使函数也是对象,且属于一个类型Function,这说明函数可以赋值给变量或者作为参数传递给其他函数,这正是函数式编程的典型特征。
函数声明
- 不显式声明返回值类型,会默认当作
dymastic处理,没有类型推断
int sum(int a, int b) {
return a + b;
}
// 不声明返回值类型, 当作 dymastic 处理, 不是推断得到的类型
sum2(int a, int b) {
return a + b;
}
// 单表达式函数
bool isTrue (bool result) => !result;
函数参数
可选的位置参数:使用
[]对可空类型参数进行包装, 需放置在参数列表的最后面// 函数参数
String see(String from, String msg, [String? states]) {
var result = '$from see $msg';
if (states != null) {
result = '$result in $states';
}
return result;
}
print(see('I', 'you')); // 不带可选参数调用
print(see('I', 'you', 'a football game')); // 带可选参数调用
可选的命名参数:使用
{}对可空类型参数进行包装, 需放置在列表参数的最后面。Flutter中常用。void setFlags({bool? isFromOuter, bool? isShow}) {
// 处理逻辑...
}
setFlags(isFromOuter: false, isShow: true); // 带可选参数调用
说明:不能同时使用可选的位置参数和可选的命名参数;可选参数列表需为可空类型,否则编译会报错
函数作为变量
// 函数作为变量
var say = (str) {
print(str);
};
say("hello");
函数作为类型参数
// 函数作为函数参数
void execute(var callback) {
callback();
}
execute(() => print("callback!"));
Dart 初探 (一)的更多相关文章
- Flutter初探与环境搭建
最近组里有个前端的同事在疯狂学习Flutter,本来上半年就一直想学它,但是..由于个人的原因还有其它的东东想学就一直把它给无限搁置了,为了跟上时代的潮流所以接一来还是下定决定好好将它学一下,毕境如今 ...
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- React错误: Can't resolve 'react-dom/client'
错误截图 解决方案 当你的react版本低于18时,但仍然报这个错误,可以采用如下方案 意外的发现当我采用上述方案时,我的React路由跳转时,页面不刷新的问题也解决了,很神奇,日后技艺精进再补充.
- python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量
编程基础常识 一.注释 1.对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中 2.注释分为:单行注释和多行注释 3.用#号开始,例如:#这是我的第一个python程序 4.注释可以写在单独 ...
- .Net AsyncLocal介绍
AsyncLocal的基本概念 AsyncLocal是一个在异步环境中存储和传递状态的类型.它允许你在线程或任务之间共享数据,而不会受到异步上下文切换的影响. 每一个异步的AsyncLocal的数据都 ...
- 7、Spring之基于注解管理bean
本质上:所有一切的操作都是Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行. 7.1.环境搭建 创建名为spring_ioc_annotation的新module,过程参考3.1 ...
- Linux 内核音频数据传递主要流程 (上)
Linux 用户空间应用程序通过声卡驱动程序(一般牵涉到多个设备驱动程序)和 Linux 内核 ALSA 框架导出的 PCM 设备文件,如 /dev/snd/pcmC0D0c 和 /dev/snd/p ...
- Go 并发编程 - runtime 协程调度(三)
Go Runtime Go runtime 可以形象的理解为 Go 程序运行时的环境,类似于 JVM.不同于 JVM 的是,Go 的 runtime 与业务程序直接打包在一块,是一个可执行文件,直接运 ...
- 《Kali渗透基础》07. 弱点扫描(一)
@ 目录 1:漏洞发现 1.1:Exploit-DB 1.2:searchsploit 1.3:nmap 2:漏洞管理 3:弱点扫描类型 4:漏洞基本概念 4.1:CVSS 4.2:CVE 4.3:O ...
- 集群部署专题之二:超高性能RPC框架Zeroc-ICE集群部署简易教程
一.前言 Zeroc ICE在简中互联网的资料十分匮乏,以至于大家线上使用时可能会有所顾虑.其实大家尽可放心,ZerocICE是一款性能和稳定性都非常优秀的RPC组件,这也是我当时选择ZerocICE ...
- 从内核世界透视 mmap 内存映射的本质(原理篇)
本文基于内核 5.4 版本源码讨论 之前有不少读者给笔者留言,希望笔者写一篇文章介绍下 mmap 内存映射相关的知识体系,之所以迟迟没有动笔,是因为 mmap 这个系统调用看上去简单,实际上并不简单, ...
- 【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的解决之路
问题描述 在微软云存储账号的服务中,存储一些静态图片,然后通过App Service访问,但是遇见了400 - condition headers not support 错误. 在单独通过浏览器访问 ...