Flutter入门:dart基础

简介: 在dart中构造函数的名字可以是 ClassName 或者 ClassName.identifier

构造函数


在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);


目录
相关文章
|
2月前
|
Dart
如何在 Flutter 项目中使用 Dart 语言?
如何在 Flutter 项目中使用 Dart 语言?
127 58
|
18天前
|
Dart
flutter dart mixin 姿势
flutter dart mixin 姿势
|
1月前
|
Dart 开发者 Windows
flutter:dart的学习
本文介绍了Dart语言的下载方法及基本使用,包括在Windows系统上和VSCode中的安装步骤,并展示了如何运行Dart代码。此外,还详细说明了Dart的基础语法、构造函数、泛型以及库的使用方法。文中通过示例代码解释了闭包、运算符等概念,并介绍了Dart的新特性如非空断言操作符和延迟初始化变量。最后,提供了添加第三方库依赖的方法。
28 12
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
74 7
|
3月前
|
Dart 前端开发 JavaScript
Flutter&Dart-异步编程Future、Stream极速入门
Flutter&Dart-异步编程Future、Stream极速入门
72 4
Flutter&Dart-异步编程Future、Stream极速入门
|
3月前
|
Dart JavaScript 前端开发
Dart或Flutter中解决异常-type ‘int‘ is not a subtype of type ‘double‘
Dart或Flutter中解决异常-type ‘int‘ is not a subtype of type ‘double‘
128 4
|
3月前
|
Dart
Flutter笔记:手动配置VSCode中Dart代码自动格式化
Flutter笔记:手动配置VSCode中Dart代码自动格式化
444 5
|
3月前
|
Dart 开发工具 Android开发
Android Studio导入Flutter项目提示Dart SDK is not configured
Android Studio导入Flutter项目提示Dart SDK is not configured
296 4
|
3月前
|
Dart 安全 API
Android跨平台开发之Dart 3.5 与 Flutter 3.24:革新跨平台应用开发
【Dart 3.5 与 Flutter 3.24:革新跨平台应用开发】首发于公众号“AntDream”。本文深度解析 Dart 3.5 和 Flutter 3.24 的新特性,包括空安全强化、Web 与原生互操作性增强及 Flutter GPU API 等,展示了如何提升代码质量和用户体验。
63 1
|
3月前
|
Kubernetes Cloud Native 搜索推荐
探索云原生技术:Kubernetes入门与实践打造个性化安卓应用:从零开始的Flutter之旅
【8月更文挑战第31天】云原生技术正改变着应用开发和部署的方式。本文将带你了解云原生的基石——Kubernetes,通过实际的代码示例,从安装到部署一个简单的应用,让你迅速掌握Kubernetes的核心概念和操作方法。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你进入云原生世界的桥梁。