1.Dart之闭包的使用
之前写Java和C#的时候,如果想让多个调用的方法,共享一个变量,那这个变量的作用域起码应该是不能太小的,或者通过传递引用实现,在Dart里面可以尝试使用闭包的方案,代码如下:
fn() {
int i = 10;
return () {
i++;
print(i);
};
};
var f = fn();
f();
f();
f();
这个fn在dart里面是内部方法,在一个方法内部定义。然后它返回一个匿名方法并命名为f,然后通过f(),调用这个方法。就达到了三次执行f方法共享i的目的。这种写法在Dart里面叫闭包。闭包可以让一个变量既有全局变量的特点,又有局部变量的特点。
2.Dart语言没有访问修饰符(private、public),如果希望让某个属性权限是private,则需要在变量名前加"_":
String _name;
void setName(String value)
{
_name = value;
}
String getName()
{
return _name;
}
方法也是一样的:
//private
void _fun()
{
}
//public
void fun()
{
}
需要注意的是,要让私有方法或者属性生效,要求必须是在不同的类文件中。两个类如果在同一个文件中,那么这个私有特性是不生效的。
3.自执行方法:
((int n) {
print(n);
print('我是自执行方法');
})(12);
4.默认构造函数:
class model
{
String name;
String id;
model(String name,String id)
{
this.name=name;
this.id=id;
}
}
可以简写为:
class model
{
String name;
String id;
model(this.name,this.id);
}
Dart不支持默认构造函数的重载,如果想实现重载的效果,则使用命名构造函数。
5.命名构造函数:
class model
{
String name;
String id;
model(this.name,this.id);
model.setName(String name)
{
this.name=name;
}
}
setName(String name)便是命名构造函数。它同样支持简写:
class model
{
String name;
String id;
model(this.name,this.id);
model.setName(this.name);
}
使用方法如下:
var v=model.setName('name');
6.getter和setter。这个有些像c#里面的属性,它也是一种属性,所以不能和普通的属性重名:
class model
{
String name;
String id;
String _sex;
get all{
return '${this.name}+${this.id}+${this._sex}';
}
set setSex(sex){
this._sex=sex;
}
}
它是一种组合属性,普通的属性不是很灵活,用这种方法定义属性之后,就灵活很多了。
7.联缀操作,用..来进行一系列操作:
main(List<String> arguments) {
Staff u=Staff();
u..id="test"
..name='ceshi'
..printInfo();
}
class Staff
{
String id;
String name;
void printInfo()
{
print('id:$id,name:$name');
}
}
8.Dart里面没有接口,要实现类似的功能,用抽象类来实现,下面的两种继承是有区别的,使用extends表示将抽象类当成普通抽象类来使用,使用implements表示把抽象类当成接口来使用,那么实现类必须全部重写抽象类定义的方法。
abstract class DbService
{
insert();
bool delete();
void add()
{
print('add');
}
}
class MySql implements DbService
{
@override
bool delete() {
// TODO: implement delete
return null;
}
@override
insert() {
// TODO: implement insert
return null;
}
@override
void add() {
// TODO: implement add
}
}
class Postgresql extends DbService
{
@override
bool delete() {
// TODO: implement delete
return null;
}
@override
insert() {
// TODO: implement insert
return null;
}
}
9.使用with关键字实现多继承:
//A和B都必须继承object,不能继承其他的,同时都不能有构造函数
//如果A和B有同样的方法,后面的会覆盖前面的
class A
{}
class B
{}
class C with A,B
{
}
10.泛型,和C#写法差不多:
T test<T>(T t) {
return t;
}
11.Dart引用库的时候可以指定部分可见:
添加一个测试文件tool.dart,并写三个方法:
void get()
{}
void set()
{}
void delete()
{}
使用时:
import 'tool.dart' hide set;
main(List<String> arguments) {
get();
delete();
}
或者:
import 'tool.dart' show delete,set;
main(List<String> arguments) {
set();
delete();
}
show和hide用来控制哪些引用,哪些不引用。
12.第三方库的使用,第三方库的地址:https://pub.dev/packages
需要什么库,直接在里面搜索就可以了,找到后,在项目的pubspec.yaml加上依赖,编译器(我用的是vs code)就会自动下载:
dependencies:
http: ^0.12.0+2
date_format: ^1.0.6
也可以参考网站里面的Installing页面提供的方法进行下载引用: