赞
踩
简述:
又是一段新的开始,Dart这门语言相信很多人都是通过Flutter这个框架才了解的,因为Flutter相比Dart更被我们所熟知。很多人迟迟不愿尝试Flutter原因大多数是因为学习成本高,显然摆在面前的是需要去重新学习一门新的语言dart,然后再去学习一个开发框架Flutter,再加上很多莫名奇妙的坑,不说多的就从Github上Flutter项目issue数来看坑是着实不少,所以很多人也就望而却步了。当然这个问题是一个新的技术框架刚开始都可能存在的,但我们更需要看到Flutter框架跨平台技术思想先进性。
为什么要开始一系列Dart相关的文章?
很简单,就是为了更好地开发Flutter, 其实开发Flutter使用Dart的核心知识点并不需要太过于全面,有些东西根本用不到,所以该系列文章也将是有选择性选取Dart一些常用技术点讲解。另一方面,读过我文章的小伙伴就知道我是Kotlin的狂热忠实粉, 其实语言都是相通,你可以从Dart身上又能看到Kotlin的身影,所以我上手Dart非常快,可以对比着学习。所以后期Dart文章我会将Dart与Kotlin作为对比讲解,所以如果你学过Kotlin那么恭喜你,上手Dart将会非常快。
该系列Dart文章会讲哪些内容呢?
本系列文章主要会涉及以下内容: dart基本语法、变量常量和类型推导、集合、函数、面向对象的Mixins、泛型、生成器函数、Async和Await、Stream和Future、Isolate和EventLoop以及最后基本介绍下DartVM的工作原理。
这是第一个Hello Dart程序,很多程序入口都是从main函数开始,所以dart也不例外,一起来看下百变的main函数
//main标准写法 void main() { print('Hello World!');//注意: Dart和Java一样表达式以分号结尾,写习惯Kotlin的小伙伴需要注意了, 这可能是你从Kotlin转Dart最大不适之一。 } //dart中void类型,作为函数返回值类型可以省略 main() { print('Hello World!'); } //如果函数内部只有一个表达式,可以省略大括号,使用"=>"箭头函数; //而对于Kotlin则是如果只有一个表达式,可以省略大括号,使用"="连接,类似 fun main(args: Array<String>) = println('Hello World!') void main() => print('Hello World!'); //最简写形式 main() => print('Hello World!');
在dart中的一切皆是对象,包括数字、布尔值、函数等,它们和Java一样都继承于Object, 所以它们的默认值也就是null. 在dart主要有: 布尔类型bool、数字类型num(数字类型又分为int,double,并且两者父类都是num)、字符串类型String、集合类型(List, Set, Map)、Runes类和Symbols类型(后两个用的并不太多)
在dart中和C语言一样都是使用bool
来声明一个布尔类型变量或常量,而在Kotlin则是使用Boolean
来声明,但是一致的是它对应的值只有两个true和false.
main() {
bool isClosed = true;//注意,dart还是和Java类似的 [类型][变量名]方式声明,这个和Kotlin的 [变量名]:[类型]不一样.
bool isOpened = false;
}
在dart中num、int、double都是类,然后int、double都继承num抽象类,这点和Kotlin很类似,在Kotlin中Number、Int、Double都是类,然后Int、Double都继承于Number. 注意,但是在dart中没有float, short, long类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LRHtctWL-1572256025795)(/Users/mikyou/Library/Application Support/marktext/images/2019-10-24-22-02-40-image.png)]
main() {
double pi = 3.141592653;
int width = 200;
int height = 300;
print(width / height);//注意:这里和Kotlin、Java都不一样,两个int类型相除是double类型小数,而不是整除后的整数。
print(width ~/ height);//注意: 这才是dart整除正确姿势
}
此外和Java、Kotlin一样,dart也拥有一些数字常用的函数:
main() {
print(3.141592653.toStringAsFixed(3)); //3.142 保留有效数字
print(6.6.floor());//6向下取整
print((-6.6).ceil()); //-6 向上取整
print(9.9.ceil()); //10 向上取整
print(666.6.round()); //667 四舍五入
print((-666.6).abs()); // 666.6 取绝对值
print(666.6.toInt()); //666 转化成int,这中toInt、toDouble和Kotlin类似
print(999.isEven); //false 是否是偶数
print(999.isOdd); //true 是否是奇数
print(666.6.toString()); //666.6 转化成字符串
}
在Dart中支持单引号、双引号、三引号以及$字符串模板用法和Kotlin是一模一样的。
main() {
String name = 'Hello Dart!';//单引号
String title = "'Hello Dart!'";//双引号
String description = """
Hello Dart! Hello Dart!
Hello Dart!
Hello Dart! Hello Dart!
""";//三引号
num value = 2;
String result = "The result is $value";//单值引用
num width = 200;
num height = 300;
String square = "The square is ${width * height}";//表达式的值引用
}
和Kotlin一样,dart中也有很多字符串操作的方法,比如字符串拆分、子串等
main() { String url = "https://mrale.ph/dartvm/"; print(url.split("://")[0]); //字符串分割split方法,类似Java和Kotlin print(url.substring(3, 9)); //字符串截取substring方法, 类似Java和Kotlin print(url.codeUnitAt(0)); //取当前索引位置字符的UTF-16码 print(url.startsWith("https")); //当前字符串是否以指定字符开头, 类似Java和Kotlin print(url.endsWith("/")); //当前字符串是否以指定字符结尾, 类似Java和Kotlin print(url.toUpperCase()); //大写, 类似Java和Kotlin print(url.toLowerCase()); //小写, 类似Java和Kotlin print(url.indexOf("ph")); //获取指定字符的索引位置, 类似Java和Kotlin print(url.contains("http")); //字符串是否包含指定字符, 类似Java和Kotlin print(url.trim()); //去除字符串的首尾空格, 类似Java和Kotlin print(url.length); //获取字符串长度 print(url.replaceFirst("t", "A")); //替换第一次出现t字符位置的字符 print(url.replaceAll("m", "M")); //全部替换, 类似Java和Kotlin }
和Kotlin一样,dart也是通过 is 关键字来对类型进行检查以及使用 as 关键字对类型进行强制转换,如果判断不是某个类型dart中使用 is! , 而在Kotlin中正好相反则用 !is 表示。
main() {
int number = 100;
double distance = 200.5;
num age = 18;
print(number is num);//true
print(distance is! int);//true
print(age as int);//18
}
在Dart中的Runes和Symbols类型使用并不多,这里做个简单的介绍, Runes类型是UTF-32字节单元定义的Unicode字符串,Unicode可以使用数字表示字母、数字和符号,然而在dart中String是一系列的UTF-16的字节单元,所以想要表示32位的Unicode的值,就需要用到Runes类型。我们一般使用\uxxxx
这种形式来表示一个Unicode码,xxxx
表示4个十六进制值。当十六进制数据多余或者少于4位时,将十六进制数放入到花括号中,例如,微笑表情(?)是\u{1f600}
。而Symbols类型则用得很少,一般用于Dart中的反射,但是注意在Flutter中禁止使用反射。
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);//返回十六位的字符单元数组
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
在Dart中所有东西都是对象,都继承于Object, 所以可以使用Object可以定义任何的变量,而且赋值后,类型也可以更改。
main() {
Object color = 'black';
color = 0xff000000;//运行正常,0xff000000类型是int, int也继承于Object
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。