1.Dart程序运行的入口是main函数,所以写一段Dart程序时,必须要有main函数
void main(List args){
print("Hello Dart");
}
2.Dart定义变量
Dart为强类型语言
第一种定义变量方式,明确类型声明,如
String name = "xiaoming";
int age = 1;
double height = 12.1;
int a = "xiaoming"; //错误的定义方式
print("${name} ${age} ${height}");
//如果是变量的话{}可以省略,有的时候不能省略
print("$name $age $height");
//打印类型
print(name.runtimeType);
print(age.runtimeType);
print(height.runtimeType);
第二种定义变量方式,类型推导方式,如
var hint = "hello";
//hint = 100; //错误的赋值,hint为String类型
print("$hint");
const name1="你好"; //常量,不可再赋值
final name2="你好"; //常量,不可再赋值
//区别
// const 声明时必须直接赋值
// final 可以运行时赋值,如接收一个函数的返回值
dynamic cc = "a";
cc = 10; //可以
print(cc.runtimeType);
3.Dart支持10进制和16进制,其他不支持
4.Dart中不通过非空值作为Boolean 类型来判断
String s = "123";
if(s){ //行不通
//
}
5.定义字符串的三种方式,三种方式都可以
String s1 = "123456";
String s2 = '123456';
String s3 = '''
abc
def
''';
//当$后面是表达式时,则必须放在{}中
print("name:${name.runtimeType} age:${age.runtimeType} height:${height.runtimeType}");
6.集合
List Set Map
void main(List args){
List nameList = ['xiaoming','xiaohong','xiaogang','xiaoming','xiaohong'];
Set numberList = {1,2,3,4,5,6};
// print(nameList);
// print(numberList);
// Set集合不能有重复元素,可以使用Set来去重
List newNameList = List.from(Set.from(nameList));
print(newNameList);
Map info = {
"name":"yes",
"age":18,
"height":2.1
};
print(info);
}
7.Dart的函数
//如何让函数的参数可传可不传?
两种方式:
1.通过[]将参数括起来是位置方式,值参会按顺序传参,如果不传为null
2.通过{}将参数括起来是命令方式,传参数时以key:value的形式传参
可以给可选参数设置默认值,必传参数不可设置默认值
void main(List args){
testFun1("li",18,29.1);
testFun1("li");
testFun1("li",16);
testFun2("li",age:12);
}
void testFun1(String name,[int age=20,double height]){
// age=20表示没有参数时,使用默认值20
print(name);
print(age);
print(height);
}
void testFun2(String name,{int age=20,double height}){
print(name);
print(age);
print(height);
}
函数可以作为另一个函数的参数传递
void main(List args){
testFun2(testFun1);
}
void testFun1(){
print("函数可以作为参数传递");
}
void testFun2(Function test){
test();
}
函数可以作为另一个函数的返回值
void main(List args){
Function tempFunc = testFun2();
tempFunc(); //调用返回的函数
}
void testFun1(){
print("函数可以作为另一个函数的返回值");
}
Function testFun2(){
return testFun1;
}
匿名函数的使用
void main(List args){
List nameList = ['xiaoming','xiaohong','xiaogang'];
//forEach()中要求传一个函数,可以通过 (参数) {} 直接定义一个匿名函数传入
nameList.forEach((item){
print(item);
});
//如果只有一行简单的代码,可以使用箭头函数
nameList.forEach((item)=> print(item));
}
map函数的使用
List nameList = ['xiaoming','xiaohong','xiaogang'];
final result = nameList.map((item)=> item+"hahaha");
print(result);
//将result转换为一个数组
final result = List.from(nameList.map((item)=> item+"hahaha"));
print(result);
8.类
main(List args){
// final p = new Person();
final p = Person(); //Dart 2.0以上版本 可以省略new
p.name="gao";
p.age = 12;
p.eating();
}
class Person {
String name;
int age;
void eating(){
print("${this.name}在吃早餐");
}
}
9.构造函数
1.无构造函数时,默认创建一个无参构造函数
2.Dart不支持构造函数的重载
main(List args){
// final p = new Person();
// final p = Person("xiaoming",12); //Dart 2.0以上版本 可以省略new
// final p = Person("xiaoming");
// final p = Person(name:"xiaoming", shengao:170);
Map params = {
"name":"Jerry",
"age":20,
"shengao":190
};
final p = Person.fromMap(params);
// p.name="gao";
// p.age = 12;
p.eating();
}
class Person {
String name;
int age;
int shengao;
//方式1
// Person(String name, int age){
// this.name = name;
// this.age = age;
// }
//方式2
// Person(String name,[int age,int shengao]){
// this.name = name;
// this.age = age;
// this.shengao = shengao;
// }
//方式3
// Person(String name,{int age,int shengao}){
// this.name = name;
// this.age = age;
// this.shengao = shengao;
// }
// //方式4
// Person({String name,int age,int shengao}){
// this.name = name;
// this.age = age;
// this.shengao = shengao;
// }
//方式5 语法糖写法,效果与方式4一致
、// Person({this.name, this.age, this.shengao});
//初始化列表 可以在:后面初始化列表
Person({this.name, this.age, this.shengao}) : twoAge = age * 2;
//方式6 通过传入map数据来创建构造函数
//命名构造函数
Person.fromMap(Map map) {
this.name = map["name"];
this.age = map["age"];
this.shengao = map["shengao"];
}
void eating(){
print("${this.name}在吃早餐");
}
}
10.抽象类
抽象类跟java中类似
默认类也是接口,可以被implements
11. dynamic和Object有什么区别?
Dart中默认所有类继承自Object
dynamic 可以动态指定类型