文章目录
一、准备
在IDEA上练习Dart,首先要安装Dart插件。
下载Dart SDK:http://www.gekorm.com/dart-windows/
1.下载Dart插件:
2.重启IDEA后,配置Dart SDK
3.运行
void main(){
print("hello!");
}
二、Dart变量
var修饰变量,未初始化的变量初始值为null,即使变量是int类型。可不指定类型,会自动推断:
// var name='husky';
// String name='husky';//显示声明类型
// Object name='husky';//若对象不限于单一类型,可定义为Object或者dynamic
final name='husky';//变量不会在变化了,且final变量只能设置一次
print(name);
const可定义编译时常量,也可用static const定义类
//创建常量的值
// var husky=const[];
// const husky=[];
final husky=const[];
三、基本数据类型
3.1Number
包含有int(不大于64位的整数值)和double(64-bit 双精度浮点数)
3.2String
Dart 字符串是 UTF-16 编码的字符序列,可以使用单引号或者双引号
var s1="husky";
var s2='husky';
当然也可以在字符串中使用表达式:
print('哈士奇是:+$s1');
使用3对单引号或双引号,可创建多行字符串:
var s3='''
num1
num2
''';
var s4="""
num1
num2
""";
3.3 Boolean
Dart是强bool类型检查
bool isTrue=true;
if(isTrue){
print("这是true");
}
3.4 List
var list=[1,2,3];
print(list.length);
3.5 Set
set是一组无序的集合
var set=['a','b','c'];
var set2=<String>{};//创建空set
set2.add('a');
3.6 Map
K-V可以是任意类型的对象,K是唯一的
var map={1:'a',2:'b'};
//Map构造
var map2=new Map();
map2[1]='a';
map2[2]='b';
四、函数
函数可以赋值给变量,也能当做其他函数的参数
//直接在main方法中调用:showName('my name is husky');
void showName(String name){
print(name);
}
4.1 可选参数
①可选命名参数
通过使用paramName:value的方式指定参数名称,得知参数含义
//调用
show(paramName:String);
//定义
void show({Type paramName}) {
print(paramName);
}
②可选位置参数
把函数的参数放入到[]中
//调用show('a','husky');
void show(String s,[String name]) {
var result='传进来的是:$s';
if(name!=null){
result='$result 和 $name';
}
print(result) ;
}
4.2默认无参数值
可以使用 = 来定义可选参数的默认值, 默认值必须是编译时常量。 如果没有提供默认值,则默认值为 null
//调用:show('a');show('a','hello');
void show(String s,[String name='husky']) {
var result='传进来的是:$s';
if(name!=null){
result='$result 和 $name';
}
print(result) ;
}
4.3 mian函数
是程序的入口,返回值是void
//调用:printName('husky');
void printName(String s) {
print('name is $s');
}
4.4 匿名函数
格式:
([[Type] param1[, …]]) {
codeBlock;
};
定义参数为i的匿名函数:
//匿名函数
var list=['a',"b","c"];
list.forEach((i){
print(list.indexOf(i).toString()+":"+i);
});
五、流程控制
5.1 for循环
var msg=new StringBuffer('a');
for(var i=0;i<3;i++){
msg.write(i);
print(i);
}
for - in形式遍历:
var list=[1,2,3];
for (var l in list){
print(l);
}
5.2 switch case
Switch语句比较整型、字符串或者编译时常量,被比较的对象必须都是同一个类的实例(不能是其子类),并且这个类不允许覆写 ==
String s='husky';
switch(s){
case 'a':
print('a');
break;
case 'husky':
print("husky");
break;
}
六、捕获异常
on指定异常类型,catch捕获异常对象,finally最终执行
try {
//...
} catch(e) {
print('Error: $e');
} finally {
//...
}
try {
//...
} on OutOfLlamasException {
//...
} on Exception catch (e) {
print('Unknown exception: $e');
} catch (e) {
print('Something really unknown: $e');
}
七、多继承
类似于scala,通过with实现多继承。
class Animal{
run(){
print('跑');
}
}
class Dog{
eat(){
print('吃');
}
}
class Husky extends Animal with Dog{
String name;
Husky(String name){
this.name=name;
}
}
调用:
var dog=new Husky('husky');
dog.run();
dog.eat();
八、引入库
使用import来引入一个库,对于Dart语言内置的库:
import 'dart:io';
对于第三方的库:
import 'package:mylib/mylib.dart';
若导入的库名字出现冲突,可使用前缀来做区分:
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
Element element1 = new Element(); //使用lib1中的Element
lib2.Element element2 = new lib2.Element(); //使用lib2中的Element
当然也可以选择导入库的部分内容:
// show表示只导入foo
import 'package:lib1/lib1.dart' show foo;
// hide表示除了foo,其他部分都导入
import 'package:lib2/lib2.dart' hide foo;
延迟加载库:
//首先使用deferred as来导入
import 'package:deferred/hello.dart' deferred as hello;
//使用的时候再去加载
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
九、异步支持
Dart库中包含许多返回Future或Stream对象的异步函数,完成基本操作后不会阻塞,而是立刻返回。其中,使用await,方法必须带有async
FileOperate() async {
var file= await readFile()
//其他处理
}
十、使类可调用
如果类中实现了call()函数,那么这个类就可以当做方法被调用
class function{
call(String a,String b)=>'$a+$b';
}
main中调用:
var f=new function();
var result=f('husky','--->eat');
print(result);
十一、创建实例
对于实例的创建,可new可不new
var f=new function();
var f=function();