Flutter(Dart)基础——数据类型


Dart 数据类型

Dart 中所有的对象都是对应一个类的实例。无论是int、函数和 null 等都是对象。

Dart 中所有对象继承自 Object 类。

类型推断

Dart 是代码类型安全的语言,但是由于其支持类型推断,因此大多数变量不需要显式地指定类型。

例如:

var name = 'budaye';
var year = 2020;
var antennaDiameter = 3.7;
var flybyObjects = ['木星', '土星', '天王星', '海王星'];
var image = {'tags': ['土星'],'url': '//path/to/saturn.jpg'
};

dynamic 和 Object

前面我们说过,Dart 里所有东西都是对象,并且所有对象的父类就是 Object。

使用 Object 时,我们只是在说接受任意类型,我们需要的是一个 Object。类型系统会保证其类型安全。

如果要明确说明不需要任何类型,需要使用特殊类型 dynamic,dynamic 会告诉编译器,我们知道自己在做什么,不用做类型检测。

当我们调用一个不存在的方法时,会执行 noSuchMethod() 方法,默认情况下(在 Object 里实现)它会抛出 NoSuchMethodError。为了在运行时检测进行类型检测,Dart 提供了一个关键字 is。

内置类型

Dart 没有 byte、char 和 float,并且int、double都是 64 位。

Dart 语言支持下列的类型:

  • numbers
  • strings
  • booleans
  • lists (也被称为 arrays)
  • sets
  • maps
  • runes (用于在字符串中表示 Unicode 字符)
  • symbols

可以直接使用字面量来初始化上述类型。例如 ‘This is a string’ 是一个字符串字面量,true 是一个布尔字面量。

由于 Dart 中每个变量引用都指向一个对象(一个 类 的实例),你通常也可以使用 构造器 来初始化变量。一些内置的类型有它们自己的构造器。例如你可以使用 Map() 来创建一个 map 对象。

Numbers

Dart 支持两种 Number 类型:

1. int

整数值;长度不超过 64位,具体取值范围依赖于不同的平台。在 DartVM 上其取值位于 -263 至 263 - 1 之间。编译成 JavaScript 的 Dart 使用 JavaScript 数字,其允许的取值范围在 -253 至 253 - 1 之间。

var x = 1;
var hex = 0xDEADBEEF;
  1. double

64位的双精度浮点数字,且符合 IEEE 754 标准。

var y = 1.1;
var exponents = 1.42e5;

int 和 double 都是 num 的子类。 num 中定义了一些基本的运算符比如 +、-、*、/ 等,还定义了 abs()、ceil() 和 floor() 等方法(位运算符,比如 » 定义在 int 中)。如果 num 及其子类不满足你的要求,可以查看 dart:math 库中的 API。

从 Dart 2.1 开始,整型字面量将会在必要的时候自动转换成浮点数字面量:

double z = 1; // Equivalent to double z = 1.0

Strings

Dart 里的 String 跟 Java 中的一样,是不可变对象;但不同的是,检测两个 String 的内容是否一样,我们使用 == 进行比较;如果要测试两个对象是否是同一个对象(indentity test),使用 identical 函数。

Dart 字符串是 UTF-16 编码的字符序列。可以使用单引号或者双引号来创建字符串:

var s1 = '使用单引号创建字符串字面量。';
var s2 = "双引号也可以用于创建字符串字面量。";
var s3 = '使用单引号创建字符串时可以使用斜杠来转义那些与单引号冲突的字符串:\'。';
var s4 = "而在双引号中则不需要使用转义与单引号冲突的字符串:'";

可以在字符串中以 ${表达式} 的形式使用表达式,如果表达式是一个标识符,可以省略掉 {}。如果表达式的结果为一个对象,则 Dart 会调用该对象的 toString 方法来获取一个字符串。

var s = '字符串插值';
assert('Dart 有$s,使用起来非常方便。' == 'Dart 有字符串插值,使用起来非常方便。');
assert('使用${s.substring(3,5)}表达式也非常方便' == '使用插值表达式也非常方便。');

注:== 运算符判断两个对象的内容是否一样,如果两个字符串包含一样的字符编码序列,则表示相等。

字符串和数字之间的转换

// String -> int
var one = int.parse('1');
assert(one == 1);// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

Booleans

Dart 使用 bool 关键字表示布尔类型,布尔类型只有两个对象 true 和 false,两者都是编译时常量。

Dart 的类型安全不允许你使用类似 if (nonbooleanValue) 或者 assert (nonbooleanValue) 这样的代码检查布尔值。相反,你应该总是显示地检查布尔值。

Lists

数组 Array 是几乎所有编程语言中最常见的集合类型,在 Dart 中数组由 List 对象表示。通常称之为 List。

Dart 中 List 字面量看起来与 JavaScript 中数组字面量一样。下面是一个 Dart List 的示例:

var list = [1, 2, 3];//这里 Dart 推断出 list 的类型为 List<int>,如果往该数组中添加一个非 int 类型的对象则会报错。

List 的下标索引从 0 开始,第一个元素的下标为 0,最后一个元素的下标为 list.length - 1。

如果想要创建一个编译时常量的 List,在 List 字面量前添加 const 关键字即可。

扩展操作符(…)和 null-aware 扩展操作符(…?)

Dart 在 2.3 引入了 扩展操作符(…)和 null-aware 扩展操作符(…?),它们提供了一种将多个元素插入集合的简洁方法。

例如,你可以使用扩展操作符(…)将一个 List 中的所有元素插入到另一个 List 中:

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

如果扩展操作符右边可能为 null ,你可以使用 null-aware 扩展操作符(…?)来避免产生异常:

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

Sets

在 Dart 中,set 是一组特定元素的无序集合。 Dart 所支持的 set 由 set literals(Set 字面量) 和 Set 类所提供。 Set 字面量(literals) 是在 Dart2.2 中加入的。

下面是使用 Set 字面量来创建一个 Set 集合的方法:

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

可以使用在 {} 前加上类型参数的方式创建一个空的 Set,或者将 {} 赋值给一个 Set 类型的变量:

var names = <String>{}; // 类型+{}的形式创建Set。
// Set<String> names = {}; // 声明类型变量的形式创建 Set (This works, too).
// var names = {}; // 这样的形式将创建一个 Map 而不是 Set (Creates a map, not a set.)

注意:Map 字面量语法同 Set 字面量语法非常相似。因为先有的 Map 字面量语法,所以 {} 默认是 Map 类型。如果忘记在 {} 上注释类型或赋值到一个未声明类型的变量上,那么 Dart 会创建一个类型为 Map<dynamic, dynamic> 的对象。

从 Dart 2.3 开始,Set 可以像 List 一样支持使用扩展操作符(… 和 …?)以及 Collection If 和 Collection For 操作。

Maps

通常来说, Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。在一个 Map 对象中一个 key 只能出现一次。但是 value 可以出现多次。 Dart 中 Map 通过 Map 字面量和 Map 类型来实现。通常来说,Map 是一个键值对相关的对象。其中键和值都可以是任何类型的对象。每个 键 只能出现一次但是 值 可以重复出现多次。 Dart 中 Map 提供了 Map 字面量以及 Map 类型两种形式的 Map。

下面是一对使用 Map 字面量创建 Map 的例子:

var gifts = {// 键:    值'first': 'partridge','second': 'turtledoves','fifth': 'golden rings'
};var nobleGases = {2: 'helium',10: 'neon',18: 'argon',
};

注意:Dart 将 gifts 变量的类型推断为 Map<String, String>,而降 nobleGases 的类型推断为 Map<int, String>。如果你向这两个 Map 对象中添加不正确的类型值,将导致运行时异常。

当然,我们也可以使用 Map 的构造器创建 Map对象。

从 Dart 2.3 Map 可以像 List 一样支持使用扩展操作符(… 和 …?)以及 Collection If 和 Collection For 操作。

小结


本文介绍了Dart的语法基础:数据类型。

  1. Dart 是代码类型安全的语言,但是由于其支持类型推断,因此大多数变量不需要显式地指定类型。
  2. Dart 中所有的对象都是对应一个类的实例。无论是int、函数和 null 等都是对象。
  3. Dart 中所有对象继承自 Object 类。
  4. Dart 没有 byte、char 和 float,并且int、double都是 64 位。
  5. 如果要明确说明不需要任何类型,需要使用特殊类型 dynamic,dynamic 会告诉编译器,我们知道自己在做什么,不用做类型检测。

ps:如果觉得本文对你有所帮助,请在文章下方 “点赞” 和 “收藏” 支持下吧~

Flutter(Dart)基础——数据类型相关推荐

  1. Dart —— 基础数据类型 Number String Boolean List Map Set Rune Symbol

    Dart汇总请点击这里 内建类型 文章目录 Dart 语言支持以下内建类型: Number String Boolean List Set Map Rune Symbol Dart 语言支持以下内建类 ...

  2. flutter - dart基础之map

    Map定义 不指定泛型 var map1 = {'aa': 'aaa', 'bb': 'bbb', 'cc': true}; //直接赋值初始值print(map1); //{aa: aaa, bb: ...

  3. Flutter的优势以及Dart基础语法

    1.为什么要学习Flutter? 对于移动端开发人员来说,跨平台技术一直是关注的重点,从H5,React Native到Flutter,我们似乎一直在寻找一种能"一套代码,多端运行" ...

  4. Flutter从入门到精通之Dart基础篇(一)

    学Flutter必须先学会Dart 目录 什么是Dart? 环境搭建 入门HelloWorld 基础知识 1.  变量.常量.命名规则 2.  Dart的数据类型 3.  Dart的条件表达式 4.  ...

  5. Flutter的基础知识之Dart语法

    Flutter的基础知识之Dart语法 关于TextStyle的设置 import 'package:flutter/material.dart'; void main() => runApp( ...

  6. 用Flutter + Dart快速构建一款绝美移动App

    作者 | Wojciech Kuroczycki 译者 | 弯月 来源 | CSDN(ID:CSDNnews) 如今,与前端或移动相关的新框架层出不穷.所有从事Web开发的人都应该熟悉各种目不暇接的新 ...

  7. 不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App

    作者 | Wojciech Kuroczycki 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 如今这个时代,与前端或移动相关的新框架层出不穷.所有从事Web开发的人都应该熟悉各种目不 ...

  8. Flutter之基础Widget

    原文博客地址: Flutter之基础Widget Flutter和Dart系列文章 项目GitHub地址 Flutter作为一种全新的响应式,跨平台,高性能, 完全免费.开源的移动开发框架 Widge ...

  9. Flutter学习-基础Widget

    Flutter学习-基础Widget 1. Flutter编程范式 1.1 编程范式的理解 1.2 flutter的编程范式 2. Text Widget 2.1 普通文本展示 2.2 富文本 2.3 ...

最新文章

  1. [跟我学UML] UML包图中的包和命名空间
  2. Oracle 11.2.0.3.7 PSU补丁升级
  3. 曼哈顿距离(坐标投影距离之和)d(i,j)=|X1-X2|+|Y1-Y2|.
  4. hdu4415 不错的想法题
  5. 一款纯css3实现的响应式导航
  6. net_conv1_conv2_conv3_conv4_py
  7. css文本超出隐藏 显示三个点
  8. Spring MVC开发RESTful风格的URI
  9. ArrayBlockingQueue跟LinkedBlockingQueue的区别
  10. android 梅花布局,Android相对布局实现各种梅花效果
  11. python有什么用-我们为什么要选择学习python?学习python有什么用?
  12. Leetcode 刷题笔记(二十三) ——动态规划篇之基础题目
  13. msp430项目编程31
  14. uniapp连接蓝牙电子秤
  15. 闫啸的发明和发现20220901
  16. 获得各城市区号JS代码
  17. 微软模拟飞行2020 数字化建模分析
  18. 网络编程(含 UrlConnection 发送 HTTP 请求下载文件)
  19. 注解@NotEmpty、@NotBlank、@NotNull三者的区别及使用范围
  20. 小程序录音php上传,微信小程序录音文件.silk上传服务器转mp3格式

热门文章

  1. Linux命令之磁盘分区fdisk
  2. Heartbeat安装
  3. 谷歌分析配置行为事件
  4. kratos 微服务框架商城实战初识 kratos
  5. 基于MATLAB碎片拼接
  6. paddlepaddle初步印象
  7. 百度推广 计算机访问url,介绍一下百度推广显示URL与访问URL
  8. 使用LanProxy进行内网穿透-在家也可以ssh到学校局域网内服务器(踩了特别多坑最终成功)
  9. L1-016 查验身份证(15 分)
  10. Koa 中间件使用之 koa-jwt