Flutter入门:dart基础

Posted BennuCTech

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter入门:dart基础相关的知识,希望对你有一定的参考价值。

构造函数

在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);
关注公众号:BennuCTech,获取更多干货!

以上是关于Flutter入门:dart基础的主要内容,如果未能解决你的问题,请参考以下文章

flutter基础入门教程(Dart语法+UI布局+页面路由+后端连接)

Flutter完整开发实战详解(一Dart语言和Flutter基础)

不会Dart,还搞什么Flutter?

Flutter入门Dart语言:函数入门指南

Flutter基础Dart 相关书籍和网站推荐

『Flutter开发实战』十分钟入门Dart语言