构造函数
在dart中构造函数的名字可以是 ClassName 或者 ClassName.identifier。如:
class Point { num x, y; Point(this.x, this.y); // 命名构造函数 Point.fromJson(Map data) { ... } } 复制代码
以下代码使用 Point 和 Point.fromJson() 构造函数创建 Point 对象:
var p1 = Point(2, 2); var p2 = Point.fromJson({'x': 1, 'y': 2}); 复制代码
以下代码具有相同的效果, 但是构造函数前面的的 new 关键字是可选的:
var p1 = new Point(2, 2); var p2 = new Point.fromJson({'x': 1, 'y': 2}); 复制代码
版本提示: 在 Dart 2 中 new 关键字变成了可选的。
factory工厂构造函数
factory关键字用于修饰构造函数,这种构造函数称为工厂构造函数。
当执行构造函数并不总是创建这个类的一个新实例时,则使用 factory 关键字。 例如,一个工厂构造函数可能会返回一个 cache 中的实例, 或者可能返回一个子类的实例。
提示: 工厂构造函数无法访问 this。
工厂构造函数的调用方式与其他构造函数一样
dynamic和var和object
dynamic
在dart中dynamic是一个关键字,表示动态变量。被dynamic修饰的变量可以是任意类型,编译时不会检查类型,只有在运行时才推断类型。且同时可以随着值的变化变成另外一个类型。
dynamic x = 'hello';//编译时不会揣测数据类型,但是运行时会推断 print(x.runtimeType);//String print(x); //但是这样的坏处就是会让dart的语法检查失效,所以有可能会造成混乱而不报错 //所以不要直接使用dynamic x = 123; print(x.runtimeType);//int,说明类型是可变的 print(x); 复制代码
var
var同样是一个关键字,所谓的“弱类型“。被它修饰的变量也可以是任意类型,但是编译时就会确定类型,所以后续不能再改变类型。
var a = 'hello'; print(a.runtimeType); print(a); //a = 123;//会报错,因为第一句已经将类型确定下来 a = '123'; print(a); 复制代码
var实际上就是开发者并不关心它的类型,有编译器自动判断类型
Object
Object与java中的一样,是所有class的基类。它是静态类型检查,所以如果要使用其子类的函数,需要先进行类型转换
Object w = 1; print(w.runtimeType); print(w); //不能调用Object不存在的方法 复制代码
Map
在dart中,Map可以如json格式一般直观的创建,如
var gifts = { 'first': 'partridge', 'second': 'turtledoves', 'fifth': 'golden rings' }; var nobleGases = { 2: 'helium', 10: 'neon', 18: 'argon', }; 复制代码
当然也可以使用构造函数,如
var gifts = Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings'; var nobleGases = Map(); nobleGases[2] = 'helium'; nobleGases[10] = 'neon'; nobleGases[18] = 'argon'; 复制代码
使用时也一样,直接用中括号[]取值,没有get之类的函数。
String first = gifts['first'] 复制代码
json
jsonDecode
jsonDecode是将json格式字符串转成json
dynamic jsonDecode(String source, {Object reviver(Object key, Object value)}) 复制代码
这里dynamic是dart中的一个关键字,就是动态类型。这里不细说了。
jsonDecode实际上返回的会是Map或者List,分别对应JsonObject和JsonArray 如果是Map,可以直接通过“[]“访问属性
var json = jsonDecode(str); var name = json['name']; 复制代码
如果是List,则可以通过forEach遍历
var array = jsonDecode(str); array.forEach((item){ var name = item['name']; //这里假设了array里是Map,也可以是List,String,int等,也可以是混合的 }); 复制代码
jsonEncode
jsonEncode是将object转成json格式的字符串。
String jsonEncode(Object value, {Object toEncodable(Object nonEncodable)}) 复制代码
这里注意object类必须实现Map toJson()函数,否则报错
Unhandled exception:
Converting object to an encodable object failed: Instance of 'xxx'
这是因为jsonEncode正是调用这个函数才将一个对象转成字符串的,而这个函数实际上就是将这个对象转成Map。
比如:
class JsonDemo { String name; String value; Map toJson() { Map map = new Map(); map["name"]= this.name; map["value"] = this.value; return map; } } 复制代码
解析
JsonDemo jsonDemo = new JsonDemo(); ... String str = jsonEncode(jsonDemo);