Dart for Windows 下载安装包
vscode编辑器安装dart 和code runner插件
main(){ print('hello dart') } //表示main方法没有返回值 void main(){ print('hello dart') }
1.定义变量
可以使用var关键字也可以通过类型声明变量
var str ="this is var"; String str = "this is String"; int str =123; void main() { var str = "你好 dart"; print(str);//打印 }数字类型:int
字符串类型:String
2.dart的命名规则
变量名称必须是数字、字母、下划线和美元符号($)组成
注意:标识符开头不能是数字
标识符不能是保留字和关键字
变量的名字是区分大小的:age和Age是不同的变量。(建议不这样用)
建议变量名使用名词,方法名使用动词
final 和 const 修饰符
const 值不变一开始就需要赋值
final开始可以不复制,只能赋值一次;而final不仅有const 的编译时常量的特性,最重要的是他运行时常量,并且final是惰性初始化,及运行时第一次使用前才被调用
永远不改变的量,使用final和const修饰他,而不是var或者其他变量类型。
void main() { final date = new DateTime.now(); print(date); } //此时const会报错,调用方法赋值给一个常量时,使用final。###
1.常用数据类型
Numbers(数值):int (整型) double(浮点型)
Strings(字符串):String
Booleans(布尔):bool
List(数组):在Dart中,数组是列表对象,也可以称为列表
Maps(字典):Map是一个键值对相关的对象。键和值可以是任何类型的对象。每个键
注意:不会进行类型转换
// 单引号或者双引号可以多行 String str = """ this is dart this id dart """ /* 字符串拼接 */ var str = "hello "; var str1 = "dart"; // print ("$str $str1"); print (str+str1); /* 数值类型 */ int a = 123; double b = 23.45; double c =24; console.log(c);//24.0 /* Booleans(只有两个值,true和false) */ bool flag1 = true; bool flag2 = flase; /* 条件判断语句 */ bool flag = true; if(flag){ print('真的'); }else{ print('假的'); } //==============---------------------- void main() { var a = 123; var b = "123"; if (a == b) { print('a和b相等'); } else { print('a和b不相等'); } } // a和b不相等 /* 1.第一种定义List的方法 */ void main() { var list = ['张三', '李四', '王五']; print(list.length);//3 print(list[1]);//李四 } /* 2.第二种定义List的方法 */ var lo = new List(); lo.add('张三'); lo.add('李四'); lo.add('王五'); print(lo.length); print(lo[1]); /* 1.第一种定义Maps的方式 */ var person = { "name": "张三", "gae": 28, "gender": "男", "job": ["程序员", "外卖员"], }; print(person); print(person["age"]); print(person["name"]); print(person["gender"]); print(person["job"]); /* {name: 张三, gae: 28, gender: 男, job: [程序员, 外卖员]} null 张三 男 [程序员, 外卖员] */ /* 2.第二种定义Maps的方式 */ var p = new Map(); p['name'] = '张三'; p['gae'] = 24; p['gender'] = '男'; p['job'] = ["程序员", "外卖员"]; print(p); print(p["age"]); print(p["name"]); print(p["gender"]); print(p["job"]);
2.数据类型判断
is关键词判断
var str = '1234'; if (str is String) { print('对的'); } //对的
1.算数运算符
int a =13; int b =5; print(a + b); print(a - b); print(a * b); print(a / b); print(a % b);//取余 print(a ~/ b);//取整 /* 18 8 65 2.6 3 2 */
2.关系运算符
int a =3; int b =5; print(a == b); print(a != b); print(a > b); print(a > b); print(a >= b); print(a <= b); /* false true false false false true */
3.逻辑运算符
// ! 取反 bool flag = true; print(!flag); /* &&并且 全为true才为true 否则false */ bool a = true; bool b = false; print(a&&b); /* || 或者 全为false才为false 否则true */ bool c = true; bool d = false; print(c||d); /* false true false false false true */
4.赋值运算符
1.基础赋值运算符
= ??==
b??==23; //表示如果b的值为空的话把23赋值给b
2.复合赋值运算符
+= -= *= /= %= ~/=
var a = 10; a += 10;//a=a+10; print(a); //20
3.条件表达式
/* 三目运算符 */ bool flag = true; String success = flag ? '成功' : '失败'; print(success);//成功 /* if else */ var score = 80; if (score>90) { print('优秀'); }else if(score>70){ print('良好');//良好 }else if(score>=60){ print('及格'); }else{ print('不及格'); } /* switch case */ var sex = "男"; switch (sex) { case "男": print('男'); break; case "女": print('女'); break; default: print('参数错误'); break; } //男 /* ??运算符 */ var a; var b = a ?? 10; print(b);//10 var a=22; var b = a ?? 10; print(b);//22
4.类型转换
//1.Number和String类型之间的转换 /* String==>Number parse() */ String a = '10'; var b = int.parse(a); print(b);//10 String myNum = '12.32'; var newNum = double.parse(num); print(newNum);//12.13 //当出现代码出错时,可抛出另一种结果,且不会报错 String price = ''; try{ var newPrice = double.parse(price); print(newPrice); }catch(err){ print(0);//0 } /* Number==>String toString() */ int a = 41; var str = a.toString(); print(str is String);//true /* 其他类型 ===》布尔类型 */ //isEmpty可以判断字符串是否为空 var str = ''; print(str.isEmpty);//true //判断数字是否为空 var myNum; if(myNum==null){ print('为空'); }else{ print('不为空'); } //NaN var num1 = 0/0; print(num1);//NaN if(num1.isNaN){ print('num1是NaN');//num1是NaN }
5.自增和自减运算
var a = 10; var b = a++; //先赋值后运算 print(a);//11 print(b);//10 var a1 = 10; var b1 = ++a1; //先运算后赋值 print(a1);//11 print(b1);//11 var c = 10; var d = c--; //先赋值后运算 print(c);//9 print(d);//10 var c1 = 10; var d1 = --c1; //先运算后赋值 print(c1);//9 print(d1);//9
5.循环语句
1.for循环
for (int i = 0; i < 10; i++) { print(i); } /* 0 1 2 3 4 5 6 7 8 9 */ //========================== //1.打印0-50所有的偶数 for (int i = 0; i <= 50; i++) { if (i % 2 == 0) { print(i); } } //2.求1+2+3+4+5+...+100的和 var sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } print(sum);//5050 //3.计算5的阶乘(1*2*3*4*5) var result = 1; for (int i =1; i <= 5; i++) { result *=i; } print(result);//120 //4.打印list里面['张三', '李四', '王五']的内容 var list1 = ['张三', '李四', '王五']; for (int i = 0; i <list1.length; i++) { print(list1[i]); } //5.打印list里面['张三', '李四', '王五']的内容 var list1 = [ { "name":'张三' }, { "name":'李四' }, { "name":'王五' } ]; for (int i = 0; i <list1.length; i++) { print(list1[i]['name']); }
2. while
//1.求1+2+3+4+5+...+100的和 //while var sum = 0; var i = 1; while (i <= 100) { sum += i; i++; } print(sum); //5050 //do...while... var sum = 0; var i = 1; do{ sum += i; i++; }while(i<=100); print(sum); //5050 // 区别:循环条件不成立时,do...while...会执行一次while则不执行。
3.continue和break
for (var i = 0; i < 10; i++) { if (i == 4) { continue;//跳出当次循环 } else { print(i); } } /* 0 1 2 3 5 6 7 8 9 */ for (var i = 0; i < 10; i++) { if (i == 4) { break;//终止循环 } else { print(i); } } /* 0 1 2 3 */ //break和continue只会控制当层循环体 for (var i = 1; i <6; i++) { print('外层循环---$i'); for(var j = 1; j < 4;j++){ if(j==3){ break; } print('里层循环---$j'); } } /* 外层循环---1 里层循环---1 里层循环---2 外层循环---2 里层循环---1 里层循环---2 外层循环---3 里层循环---1 里层循环---2 外层循环---4 里层循环---1 里层循环---2 外层循环---5 里层循环---1 里层循环---2 */
1.常用属性
length isEmpty isNotEmpty
reversed(列表倒序排序)
List myList = ['香蕉', '苹果', '梨', '西瓜']; print(myList.reversed); var newList = myList.reversed.toList(); print(newList); /* (西瓜, 梨, 苹果, 香蕉) [西瓜, 梨, 苹果, 香蕉] */
2.常用方法
add()
List myList = ['香蕉', '苹果', '梨', '西瓜']; myList.add('桃子'); print(myList); //[香蕉, 苹果, 梨, 西瓜, 桃子]addAll() 拼接数组
List myList = ['香蕉', '苹果', '梨', '西瓜']; myList.addAll(['桃子','柠檬','百香果']); print(myList); //[香蕉, 苹果, 梨, 西瓜, 桃子, 柠檬, 百香果]indexOf() 查找
remove() 删除
removeAt 删除 传入索引值
fillRange(start,end,'数值') 修改
insert(index,value) 插入
insertAll(index,List) 插入
join() list转换成字符串
split ()字符串转换成list
toList() 其他类型转换成List
forEach()
map()
where()
any()
every()
3.set
set 是没有顺序且不能重复的集合,所以不能通过索引获取值
var list = new Set(); list.add('苹果'); list.add('梨子'); list.add('苹果'); print(list); // {苹果, 梨子}list去重
List myList = ['香蕉', '西瓜', '梨', '西瓜']; var arr = new Set(); arr.addAll(myList); print(arr.toList());
4.Maps
映射(Maps)是无序的键值对
常用属性
keys 获取所有的可以值
values 获取所有的value值
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法
remove(key) 删除指定key 的数据
addAll({...}) 合并映射,给映射里面添加属性
containsValue 查看映射内的值 返回true/flase
forEach
map
where
any
every
Map person = { "name": '张三', "age": 24, "gender": '男', }; print(person.values); // (张三, 24, 男) //===========addAll============== person.addAll({ 'Work':['程序员','外卖员'], 'height':180 }); print(person); //{name: 张三, age: 24, gender: 男, Work: [程序员, 外卖员], height: 180} //===========remove========== person.remove('gender'); print(person); //{name: 张三, age: 24, Work: [程序员, 外卖员], height: 180} //==============containsValue================= print(person.containsValue('张三')); //true
5.循环
for
List myList = ['香蕉', '苹果', '梨', '西瓜']; for(var item in myList){ print(item); } /* 香蕉 苹果 梨 西瓜 */ forEach
//===============循环List==================== List myList = ['香蕉', '苹果', '梨', '西瓜']; myList.forEach((element) { //注意list的这里只能传一个值 print(element); }); /* 香蕉 苹果 梨 西瓜 */ //==================循环Maps========================= Map person = { "name": '张三', "age": 24, "gender": '男', }; person.forEach((key, value) { //遍历maps可以传两个参数 print('$key---$value'); }); /* name---张三 age---24 gender---男 */ //============循环Set========================= var sets = new Set(); sets.addAll(["11", "22", "33"]); sets.forEach((value) { print(value); }); /* 11 22 33 */map()
var list = [1, 8, 9]; var arr = list.map((value) { return value * 2; }); var newList = arr.toList(); print(newList); } //[2, 16, 18]where
var list = [1, 8, 9, 21, 28, 45, 85, 23]; var newList = list.where((element){ return element >= 12; }); print(newList.toList()); //[21, 28, 45, 85, 23]any 只要集合里面有一个满足条件就返回true
var list = [1, 8, 9, 21, 28, 45, 85, 23]; var flag = list.any((value){ return value >= 12; }); print(flag); //trueevery() 集合里面每一个都要满足条件才返回true
var list = [1, 8, 9, 21, 28, 45, 85, 23]; var flag = list.any((value){ return value <100; }); print(flag); //true
1.自定义方法
基本格式:
返回类型 方法名称(参数1,参数2,....){
方法体
return 返回值;
}
注意:void (可写可不写),写了表示方法没有返回值
//可以指定函数的返回类型 void main() { var txt = getString(); print(txt); } String getString() { var str = "this is String"; return str; } 调用方法传参
//1.求1到这个数的所有数之和 void main() { var n = getSum(100); print(n); var n1 = getSum(10); print(n1); } int getSum(int num) { var sum = 0; for (var i = 1; i <= num; i++) { sum += i; } return sum; } //2.打印用户信息 void main() { print(getUserInfo('张三',20)); } String getUserInfo(String name, int age) { return "姓名----$name,年龄----$age"; } //3.可选参数,参数可填可不填 void main() { print(getUserInfo('张三')); } String getUserInfo(String name,[age]) { if(age!=null){ return "姓名----$name,年龄----$age"; } return "姓名----$name,年龄保密"; } //4.默认参数赋值 void main() { var p1 = getUserInfo('张三'); print(p1); var p2 = getUserInfo('李四',20,'女'); print(p2); var p3 = getUserInfo('王五',28,); print(p3); } String getUserInfo(String name, [age, gender = "男"]) { if (age != null) { return "姓名----$name,性别----$gender,年龄----$age"; } return "姓名----$name,性别----$gender,年龄保密"; } /* 姓名----张三,性别----男,年龄保密 姓名----李四,性别----女,年龄----20 姓名----王五,性别----男,年龄----28 */ //5.命名参数 void main() { var p1 = getUserInfo('张三'); print(p1); var p2 = getUserInfo('李诗诗',age:20,gender:'女'); print(p2); } String getUserInfo(String name, {age, gender = "男"}) { if (age != null) { return "姓名----$name,性别----$gender,年龄----$age"; } return "姓名----$name,性别----$gender,年龄保密"; } //6.实现把参数当做方法的方法 void main() { fn() { print('object'); } fn1(value) { value(); } fn1(fn); } //object
2.箭头函数
//箭头函数 void main() { List myList = ['香蕉', '苹果', '梨', '西瓜']; myList.forEach((value) => print(value)); } void main() { List myList = ['香蕉', '苹果', '梨', '西瓜']; myList.forEach((value) =>{ print(value) }); } /* 香蕉 苹果 梨 西瓜 */
3.函数调用函数
void main() { //定义一个方法是否为偶数 bool isEvenNum(int n) { if (n % 2 == 0) { return true; } return false; } //获取1大100之前所有偶数 getNum(int n) { for (var i = 1; i <= n; i++) { if (isEvenNum(i)) { print(i); } } } getNum(100); }
4.匿名方法
var getNum = () { print('匿名方法'); }; getNum();
5.自执行函数
void main() { (( int n) { print(n); print('我是自执行方法'); })(20); } //20 //我是自执行方法
6.方法的递归
自己调用自己
//1.求1到n的乘积 void main() { var num = 1; fn(int n) { num*=n; if (n == 1) { return; } fn(n-1); } fn(5); print(num); } //120 //求1-100的和 void main() { var num = 0; fn(int n) { num+=n; if (n == 1) { return; } fn(n-1); } fn(100); print(num); } //5050
6.闭包
void main() { fn() { var a = 12; return () { a++; print(a); }; } var b = fn(); b(); b(); } //13 //14
1.object
dart所有东西都是对象,所有的对象都继承Object类
//自定义类 void main() { var p = new Person(); print(p.name); print(p.age); p.getName(); } class Person { String name = "詹丹"; int age = 24; void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } } /* 詹丹 24 姓名:詹丹-----年龄:24 */void main() { var p = new Person(); print(p.name); p.getName(); p.setInfo(20); print(p.age); p.getName(); }void main() { Person p = new Person(); print(p.name); p.getName(); p.setInfo(20); print(p.age); p.getName(); }class Person { String name = "詹丹"; int age = 24; void getName() { print("姓名:${this.name}-----年龄:${this.age}"); }
void setInfo(int age) { this.age = age; } } /* 詹丹 姓名:詹丹-----年龄:24 20 姓名:詹丹-----年龄:20 */
2.构造函数
程序运行自动触发的方法
void main() { Person p = new Person(); } class Person { String name = "詹丹"; int age = 24; void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } void setInfo(int age) { this.age = age; } //默认构造函数 Person() { print('这是一个构造函数'); } } // Person p = new Person();实例化对象的时候触发。 void main() { Person p = new Person('詹丹', 20); p.getName(); Person p2 = new Person('李四', 28); p2.getName(); } class Person { var name; var age; Person(String n, int a){ this.name = n; this.age = a; } //简写 Person(this.name, this.age); void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } } /* 姓名:詹丹-----年龄:20 姓名:李四-----年龄:28 *///命名构造函数 void main() { Person p = new Person('詹丹', 20); p.getName(); Person p2 = new Person('李四', 28); p2.getName(); Person p3 = new Person.setInfo('李四', 32); p3.getName(); } class Person { var name; var age; //简写 Person(this.name, this.age); Person.now() { print('我是命名构造函数'); } void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } Person.setInfo(String name, int age) { this.name = name; this.age = age; } } /* 姓名:詹丹-----年龄:20 姓名:李四-----年龄:28 姓名:李四-----年龄:32 */
3.私有属性和方法
在属性名和方法名前面加:_即可变成私有
void _run() { print("这是一个私有方法"); }
4.类中的getter和setter
调用get里面方法,直接调用属性的方式访问即可
void main() { //获取面积 var r = new Rect(10, 4); print("面积为:${r.area}"); } class Rect { var width; var height; Rect(this.width, this.height); get area { return this.width * this.height; } } //面积为:40setter
void main() { //获取面积 var r = new Rect(10, 4); print("面积为:${r.area}"); r.aeraHeight = 6; print("面积为:${r.area}"); } class Rect { var width; var height; Rect(this.width, this.height); get area { return this.width * this.height; } set aeraHeight(value) { this.height = value; } } 构造函数体运行之前初始化实例变量
void main() { //获取面积 var r = new Rect(); print("面积为:${r.area}"); } class Rect { var width; var height; Rect():width=3,height=10; get area { return this.width * this.height; } set aeraHeight(value) { this.height = value; } } //30
5.静态成员
使用static关键字来实现类级别的变量和函数,调用直接用类名调用
静态方法不能访问非静态成员,非静态方法可以访问静态成员
非静态方法必须实例化才能使用
void main() { print(Person.name); Person.show(); } class Person { static String name = "张三"; static void show() { print(name); } } /* 张三 张三 */
6.对象操作符
? 条件运算符(了解)
as 类型转换
is 类型判断
..级联操作(连缀)
//======================is-================ void main() { Person p = new Person(); if (p is Person) { p.name = "Bob"; p.getName(); } } class Person { String name = "詹丹"; int age = 24; void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } void setInfo(int age) { this.age = age; } } // ==========..===================== void main() { Person p = new Person(); p ..name = "Jeny" ..age = 20 ..getName(); } class Person { String name = "詹丹"; int age = 24; void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } void setInfo(int age) { this.age = age; } } //姓名:Jeny-----年龄:20
7.继承
子类通过extends关键字来继承父类
子类会继承父类可见的属性和方法,但是不会继承构造函数
子类能复写父类的方法,getter和 setter
void main() { Web w = new Web('Bob', 12); w.getName(); } class Person { var name; var age; Person(this.name, this.age); void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } } class Web extends Person { Web(super.name, super.age);//实例化子类给父类传参 } //姓名:Bob-----年龄:12子类定义属性和方法
void main() { Web w = new Web('Bob', 12,'男'); w.run(); } class Person { var name; var age; Person(this.name, this.age); void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } } class Web extends Person { var sex; Web(super.name, super.age, String sex) { this.sex = sex; } run(){ print("姓名:${this.name}---性别:${this.sex}-----年龄:${this.age}"); } } //姓名:Bob---性别:男-----年龄:12覆写父类的方法
void main() { Web w = new Web('Bob', 12); w.getName(); } class Person { var name; var age; Person(this.name, this.age); void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } } class Web extends Person { Web(super.name, super.age); @override //可写可不写,建议留下 void getName() { print("${this.name},${this.age}"); } }子类方法调用父类方法
void main() { Web w = new Web('Bob', 12); w.run(); } class Person { var name; var age; Person(this.name, this.age); void getName() { print("姓名:${this.name}-----年龄:${this.age}"); } work() { print("${this.name}的工作是程序员"); } } class Web extends Person { Web(super.name, super.age); @override void getName() { print("${this.name},${this.age}"); } run(){ print("run"); super.work();//调用父类的方法 } }
1.定义说明
抽象类通过
abstract
关键字来定义Dart里抽象方法是没有方法体的方法;
抽象方法一定要在子类中实现
抽象类不能直接实例化,只有继承他的子类可以实例化
void main() { var d = new Dog(); d.eat(); var c = new Cat(); c.run(); Animal p = new Cat(); //p.run(); //p访问不到run,run属于Cat的私有方法 } abstract class Animal { eat(); run(); } class Dog extends Animal { @override eat() { print("小狗正在吃鸡爪"); } @override run() { print("小狗正在玩飞盘"); } } class Cat extends Animal { @override eat() { print("小猫正在吃鱼干"); } @override run() { print("小猫正在玩毛线团"); } } /*小狗正在吃鸡爪 小猫正在玩毛线团*/
2.Dart的接口实现
通过
implements
关键字实现//一个类继承多个接口 void main() { C c = new C(); c.printA(); c.printB(); } abstract class A { late String name; void printA() { print('A'); } } abstract class B { void printB() { print('B'); } } class C implements A, B { @override late String name; @override void printA() { print('A'); } @override void printB() { print('B'); } } //A //B
3.mixins
作为mixins的类只能继承自Object,不能继承其他类
作为mixins的类不能有构造函数
一个类可以mixins多个mixins类
mixins绝不是继承,也不是接口,而是一种全新的特性
//继承和mixins一起 class Person { String name; num age; Person(this.name, this.age); printInfo() { print('${this.name}----${this.age}'); } void run() { print("Person Run"); } } class A { String info = "this is A"; void printA() { print("A"); } void run() { print("A Run"); } } class B { void printB() { print("B"); } void run() { print("B Run"); } } class C extends Person with B,A{ C(String name, num age) : super(name, age); } void main() { var c = new C('张三', 20); c.printInfo(); // c.printB(); // print(c.info); c.run(); } //张三----20 //A Run (后面的会替换掉前面的,如果方法名一致的话)
1.定义
泛型就是解决类、接口、方法的复用性,以及对不特定数据类型的支持(类型校验)
//对传入和返回的数据返回类型进行校验 void main() { print(getData<double>(12)); print(getData<String>("String")); } T getData<T>(T value) { return value; } /* 12.0 String */ 案例:
void main() { var num = new PrintClass(); num.add(121); num.add(12); num.add(121); num.add(21); num.printInfo(); } class PrintClass { List list = <int>[]; void add(int value) { this.list.add(value); } void printInfo() { for (var i = 0; i < this.list.length; i++) { print(this.list[i]); } } } /* 121 12 121 21 */ //===============将以上改成泛类================= void main() { var str = new PrintClass<int>(); str.add(2); str.add(5); str.add(7); str.add(21); str.printInfo(); var num = new PrintClass<String>(); num.add('香蕉'); num.add('苹果'); num.add('梨子'); num.add('柠檬'); num.printInfo(); } class PrintClass<T>{ List list = <T>[]; void add(T value) { this.list.add(value); } void printInfo() { for (var i = 0; i < this.list.length; i++) { print(this.list[i]); } } }
2.泛型接口
实现数据缓存的功能:有文件缓存和内存缓存。都按接口约束实现
定义一个泛型接口,约束实现他的子类必须有getByKey(key)和setByKey(key,value);
要求setByKey里的value类型要和实例化子类的时候指定的类型一致。
void main() {} abstract class Cache<T> { getByKey(String key); void setByKey(String key, T value); } 实现文件缓存和内存缓存
void main() { MemoryCache m = new MemoryCache<String>(); m.setByKey('index', "我是首页数据"); MemoryCache m2 = new MemoryCache<Map>(); m2.setByKey('index', {"name":"user","password":123456}); } abstract class Cache<T> { getByKey(String key); void setByKey(String key, T value); } class FileCache<T> implements Cache<T> { @override getByKey(String key) {} @override void setByKey(String key, T value) { print('我是文件缓存,把key=${key} value=${value}的数据写到文件缓存之中了'); } } class MemoryCache<T> implements Cache<T> { @override getByKey(String key) {} @override void setByKey(String key, T value) { print('我是内存缓存,把key=${key} value=${value}的数据写到内存缓存之中了'); } }
1.第三方库
pub包管理系统
在官网找寻自己要的库
根目录创建一个pubspec.yaml的文件,内容如下:
配置dependencies
运行put get 获取远程库
看文档引入库使用
name:""; description:A new flutter module project. dependencies: http: ^0.13.4
2.系统库
import "dart:math"
void main() { print(min(22, 12)); } //12
3.处理异步方法
async 和await 关键字,只有async方法才能使用await关键字调用,如果调用别的async方法,必须使用await。
void main() async{ var result = await test(); print(result); } test() async{ return '我是一个异步方法'; }
4.库的重命名及使用
import 'lib/person1.dart'; import 'lib/person2.dart' as person2; void main(){ Person p1 = new Person(); person2.Person p2 = new person2.Person(); }
5.部分导入
import 'lib/person1.dart' show getName; //此时引入库只能使用getName方法 import 'lib/person1.dart' hide getName; //此时该库getName方法不可以使用