flutter在Windows平台下的安装配置
Flutter在Windows平台下的安装配置 - zxsh - 博客园 (cnblogs.com)
闭包(和jS中的闭包一样) 1 2 3 4 5 6 7 fn() { var a = 0 ; return () { a++; print (a); } }
创建固定长度和类型的List 1 2 3 4 5 6 7 8 List list = new List <int >.filled(2 ,0 );list[0 ] = 1 ; list[1 ] = 2 ; print (list);
命名构造函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Person { String name; int age; Person(this .name, this .age); Person.now() { print ('我是命名构造函数1' ); } Person.setIngo() { print ('我是命名构造函数2' ); } void printInfo() { print ("${this .name} ---${this .age} " ); } } void main() { Person p = new Person.now(); }
Dart和其他面向对象语言不一样,Dart中没有 public private protected这些访问修饰符号
但是我们可以使用_
把一个属性或者方法定义成私有的如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Person { String name; int _age; Person(this .name,this ._age); void printInfo() { print ("${this .name} ---${this ._age} " ); } void _run() { print ('这是一个私有方法' ); } void execRun() { this ._run(); } }
注意:只有将这个类抽离为一个文件后,在其他的文件中引入并使用的时候才能体现出这个私有的特性
1 2 3 4 5 6 7 void main() { Person p = new Person('zhangsan' ,'123' ); print (p.name); print (p._age); p._run(); p.execRun(); }
类中的getter和setter
这个类似与vue中的计算属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Rect { num height; num width; Rect(this .height,this .width); get area{ return this .height*this .width; } set areaHeight(value) { this .height=value; } } void main() { Rect r = new Rect(10 ,4 ); r.areaHeight=6 ; print (r.area); }
在构造函数体运行之前初始化实例变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Rect { int height; int width; Rect():height=2 ,width=10 { print ('${this .height} ---${this .width} ' ); } getArea() { return this .height*this .width; } } void main() { Rect r = new Rect(); print (r.getArea()); }
继承 1 2 3 4 5 6 7 8 9 10 11 12 13 class Father { String name; num age; Father(this .name,this .age); Print() { print ('${this .name} ---${this .age} ' ); } } class Son extends Father { String job; Son(String name, num age, this .job): super (name, age) {} }
在Dart中无法实现多继承
,如果想要实现多继承可以使用mixins
实现类似多继承的功能。其实就是使用with
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class A { void printA() { print ("A" ); } } class B { void printB() { print ("B" ); } } class C with A ,B { } void main() { C c = new C(); c.printA(); c.printB(); print (c is C); print (c is A); print (c is B); }
注意:mixins会随着Dart版本改变而改变
mixins注意事项:
作为mixins的类只能继承自Object,不能继承其他类。也就是说上面的A类和B类不能继承其他类。
作为mixins的类不能有构造函数。也就是说上面的A类和B类不能有构造函数。
如果非要继承继承了其他类或有构造函数的类D,那么可以这样写class C extends D with A,B
一个类可以mixins多个mixins类
mixins不是继承,也不是接口,而是一种全新的特性,A类和B类其实是C的一个超类
接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 abstract class A { String name; void my_print1(String data); } abstract class B { String age; void my_print2(String data); } class C implements A ,B { @override String name; @override String age; C(this .name,this .age); @override void my_print1(String data) { print (this .name); } @override void my_print2(String data) { print (this .age); } } void main() { C c = newe C('zhangsan' ,18 ); c.my_print1(); c.my_print2(); }
Dart可以继承多个接口
多态 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 abstract class Animal { run(); } class Dog extends Animal { @override run() { print ('Dog running' ); } } class Cat extends Animal { @override run() { print ('Cat running' ); } } void main() { Animal dog = new Dog(); Animal cat = new Cat(); dog.run(); cat.run(); }
泛型
通俗理解:泛型就是解决 类
接口
方法
的复用性、以及对不特定数据类型的支持(类型校验)
泛型方法 1 2 3 4 5 6 7 T getData<T>(T value) { return value; } void main() { print (getData(21 )); print (getData<String >("123" )); }
泛型类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class MyList <T > { List list = <T>[]; void add(T value) { this .list.add(value); } List getList() { return list; } } void main() { MyList l1 = new MyList(); l1.add("张三" ); l1.add(123 ); l1.add(true ); print (l1.getList()); MyList l2 = new MyList<String >(); l2.add("李四" ); l2.add(123 ); print (l2.getList()); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 abstract class Cache <T > { getByKey(String key); void setByKey(String key, T value); } class MemoryCache <T > implements Cache <T > { @override getByKey(String key) { return null ; } @override void setByKey(String key, T value) { } } void main() { MemoryCache m = new MemoryCache<Map >(); m.setByKey('index' , {"name" :"张三" ,"age" :20 }); }
Dart中的库、自定义库、系统库、第三方库
在Dart中库在使用时通过import关键字引入
library指令可以创建一个库,每个Dart文件都是一个库,即使没有使用library指令来指定
Dart中的库主要有三种:
我们自定义的库
系统内置库
import ‘dart:math’;
import ‘dart:io’;
import ‘dart:convert’;
Pub包管理系统中的库
需要在自己的项目根目录中新建一个pubspec.yaml
在pubspec.yaml
文件,然后配置名称、描述、依赖等信息
然后运行 pub get
获取包下载到本地
项目中引入库import 'package:http/http.dart' as http;
看文档使用
async、await 1 2 3 4 5 6 7 8 testAsync() async { return 'Hello async' ; } void main() async { var result = await testAsync(); print (result); }
解决引入的两个库中有同名的方法或类的情况 1 2 3 4 5 6 7 import 'lib/Person1.dart' ;import 'lib/Person2.dart' as lib;main(List <String > args) { Person p1 = new Person('张三' , 20 ); lib.Person p2=new lib.Person('李四' , 20 ); }
部分引入 1 2 3 4 int getAge();String getName();String getSex();
1 2 import 'lib/myfunc.dart' show getAge;import 'lib/myfunc.dart' hide getAge;
空安全中可空类型的定义 1 2 3 String? username="张三" ;username = null ; print (username);