Flutter学习4 - Dart数据类型

news2024/9/24 7:25:24

1、基本数据类型 num、int、double

(1)常用数据类型

  • num类型,是数字类型的父类型,有两个子类 int 和 double

通过在函数名前加下划线,可以将函数变成私有函数,私有函数只能在当前文件中调用

//常用数据类型
void main() {
  _numType();
}

//返回值为 void 的函数,可省略 void
_numType() {
  //num类型,是数字类型的父类型,有两个子类  int  和  double
  num num1 = -1.0; //double
  num num2 = 2; //int
  int num3 = 3; //只能是整数,不可为 int 类型赋值 浮点数
  double num4 = 1.666; //双精度浮点数

  print("num1: $num1   num2: $num2   num3: $num3   num4: $num4");
}

//num1: -1.0   num2: 2   num3: 3   num4: 1.666

(2)数据类型常用方法及类型转换

  • 绝对值函数 abs() 等
void main() {
  _numType();
}

_numType() {
  num num1 = -1.0;
   //绝对值
  print("num1: $num1   num1.abs(): ${num1.abs()}");
}

//num1: -1.0   num1.abs(): 1.0
  • 类型转换 toInt() 等
void main() {
  _numType();
}

_numType() {
  num num1 = -1.0;

  //数据类型转换
  print("num1: $num1   toInt(): ${num1.toInt()}");
}

//num1: -1.0   toInt(): -1

2、字符串 String

(1)字符串定义

  • 定义字符串,单引号/双引号 均可
void main() {
  _stringType();
}

//字符串
_stringType() {
  //定义字符串,单引号/双引号 均可
  String str1 = '窗前明月光', str2 = "疑是地上霜";
  String str3 = '$str1$str2';
  print(str3);
}

//窗前明月光,疑是地上霜

(2)字符串常用方法

  • 截断字符串 substring()
  • 查找子字符串位置 indexOf()
  • 对比字符串 compareTo()
  • ···
void main() {
  _stringType();
}

//字符串
_stringType() {
  //定义字符串,单引号/双引号 均可
  String str1 = '窗前明月光,疑是地上霜';
  //截断字符串 substring
  print(str1.substring(1, 5)); //前明月光
  //查找子字符串在父字符串˙中位置
  print(str1.indexOf("明月")); //2

  //对比两个字符串
  String str2 = 'abc', str3 = 'gdf';
  print(str2.compareTo(str3)); //-1
}

3、布尔类型 bool

  • Dart 是强 bool 类型检查的,只有 bool 类型的值是 true,才被认为是 true
void main() {
  _boolType();
}

// Dart 是强 bool 类型检查的,只有 bool 类型的值是 true,才被认为是 true
_boolType() {
  bool b1 = true, b2 = false;
  print("b1: $b1");
  print("b2: $b2");
  print("b1 || b2: ${b1 || b2}");
  print("b1 && b2: ${b1 && b2}");
}

//b1: true
//b2: false
//b1 || b2: true
//b1 && b2: false

4、集合

4.1、集合 List

(1)List 的定义
  • 初始化 List:[]
void main() {
  _listType();
}

_listType() {
  List list1 = [1, 2, 3, "Flutter", true];
  print("list1: $list1");

  List<int> list2 = [];
  // list2 = list1;  报错  List<dynamic> 类型无法转换成 List<int>
  list2.add(9);
  list2.add(8);
  list2.add(7);
  print("list2: $list2");

  List list3 = [];
  list3.add("Hello");
  list3.addAll(list1);
  print("list3: $list3");
}

//list1: [1, 2, 3, Flutter, true]
//list2: [9, 8, 7]
//list3: [Hello, 1, 2, 3, Flutter, true]
  • List 生成函数:grnerate
void main() {
  _listType();
}

_listType() {
  List list1 = List.generate(5, (index) => index * 3);
  print("list1: $list1");

  List list2 = List.generate(3, (index) => 'index: $index');
  print("list2: $list2");
}

//list1: [0, 3, 6, 9, 12]
//list2: [index: 0, index: 1, index: 2]
(2)List 常用方法
  • 遍历、插入、移除、截取、查找等方法使用
void main() {
  _listType();
}

_listType() {
  List list = List.generate(5, (index) => index * 3);
  print("list: $list"); //list: [0, 3, 6, 9, 12]

  //遍历集合
  print("--------------- 遍历 for ---------------");
  for (int i = 0; i < list.length; i++) {
    print("$i: ${list[i]}");
  }

  print("--------------- 遍历 in ---------------");
  for (var e in list) {
    print(e);
  }

  print("--------------- 遍历 forEach ---------------");
  list.forEach((element) {
    print(element);
  });

  //插入
  list.insert(0, 'start');
  print(list); //[start, 0, 3, 6, 9, 12]

  //移出
  list.removeAt(1);
  print(list); //[start, 3, 6, 9, 12]
  list.remove('start');
  print(list); //[start, 3, 6, 9, 12]

  //截取
  List list2 = list.sublist(0, 2);
  print("list: $list"); //list: [3, 6, 9, 12]
  print("list2: $list2"); //list2: [3, 6]

  //查找
  int index = list.indexOf(9);
  print("index: $index");
}

4.2、集合 Map

  • Map 是 key-value 键值对
  • key 和 value 可以是任意类型
(1)Map 定义
void main() {
  _mapType();
}

_mapType() {
  //Map 初始化
  Map map1 = {'xiaolan': '小蓝', 1: '小白', 1.2: true};
  print(map1); //{xiaolan: 小蓝, 1: 小白, 1.2: true}
  print(map1[1]); //小白

  Map map2 = {};
  map2[1] = true;
  map2['abc'] = 1.4;
  print(map2); //{1: true, abc: 1.4}

  Map<String, int> map3 = {};
  map3['leon'] = 18;
  map3['alice'] = 19;
  print(map3); //{leon: 18, alice: 19}
}
(2)Map 常用方法
  • 遍历
  • 移除
  • 判断是否包含
void main() {
  _mapType();
}

_mapType() {
  Map map = {'小蓝': 2, '小白': 1};
  print(map); //{{小蓝: 2, 小白: 1}

  // Map遍历
  map.forEach((key, value) {
    print("key: $key, value: $value");
  });
  //key: 小蓝, value: 2
  // key: 小白, value: 1

  //通过遍历生成 Map
  Map map2 = map.map((key, value) {
    return MapEntry(key, value + 1);
  });
  print(map2); //{小蓝: 3, 小白: 2}

  //遍历 keys
  for (var key in map2.keys) {
    print("key: $key, value: ${map2[key]}");
  }
  //key: 小蓝, value: 3
  // key: 小白, value: 2

  //遍历 values
  for (var value in map2.values) {
    print("value: $value");
  }
  //value: 3
  // value: 2

  //移除元素
  map2.remove('小白');
  print(map2); //{小蓝: 3}

  //是否包含元素
  print("小白还在吗?  ${map2.containsKey('小白')}"); //小白还在吗?  false
}

5、补充:dynamic、var、Object

(1)动态类型 dynamic

  • dynamic 是所有 Dart 对象的基础类型,在大多数情况下,通常不直接使用它

  • 当我们不给泛型类型指定一个类型时,系统就会将其指定为动态类型,如 List list = [];

  • 不建议使用 dynamic 类型,因为通过它定义的变量会关闭静态类型检查,有些异常只有运行时才能 carsh 出来

  • 崩溃报错

void main() {
  _dynamicType();
}

_dynamicType() {
  dynamic x = '111';
  x.foo(); //报错崩溃
  //静态类型检查时不会报错
  //但运行时报错 NoSuchMethodError: Class 'String' has no instance method 'foo'.
  //因为 String 没有 foo() 这个方法,但是因为关闭了检查,只会在运行时报错
}

静态变量检查时,不报错
在这里插入图片描述

运行时,会报 crash
在这里插入图片描述

  • 查看运行时类型
void main() {
  _dynamicType();
}

_dynamicType() {
  dynamic x = '111';
  print("x 的运行时类型:${x.runtimeType}"); //x 的运行时类型:String
  x = 123;
  print("x 的运行时类型:${x.runtimeType}"); //x 的运行时类型:int
}

(2)关键字 var

  • var 是一个关键字,定义变量时不关心变量类型是什么,系统会自动推断类型 runtimeType
  • 类似 Kotlin 中的 var
  • var 声明的变量,静态类型检查时会检查类型,但动态类型 dynamic 不会检查
void main() {
  _var();
}

_var() {
  var a = 'AAA';
  print("a 的运行时类型:${a.runtimeType}"); //a 的运行时类型:String

  a = 11; //静态类型检查时会报错,因为已经推断出是 String 类型,不能在赋值 int
  a.foo(); //静态类型检查时会报错
}

在这里插入图片描述

(3)Object 类型

  • Object 是 Dart对象的基类
  • 当定义 Object o = ‘11’; 时,系统会认为 o 是个对象,可以调用 o 的 toString() 和 hashCode() 方法,因为 Object 提供了这些方法
  • Object 声明的变量,静态类型检查时会检查类型

综上,Object 和 dynamic 的区别就在于静态类型的检查上

void main() {
  _objectType();
}

_objectType() {
  Object o1 = '11';
  print("o1运行时类型:${o1.runtimeType}"); //o1运行时类型:String
  o1 = 123;
  print("o1运行时类型:${o1.runtimeType}"); //1运行时类型:int

  o1.foo(); //静态类型检查时会报错
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 财源(裁员)广进(鸿蒙开发岗)~

2023已过去了&#xff0c;2024大家都在期待经济复苏起来&#xff0c;但并没有起来&#xff0c;倒是第一波 “裁员潮”突然来袭&#xff1a; 这一波突然袭击&#xff0c;使得一些年后想换工作的人不敢轮乱动了&#xff0c;真不知道哪一天起床就失业了 今年我已经接到了太多粉丝…

力扣OJ题——随机链表的复制

题目&#xff1a; 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 要求&#xff1a;构造这个链表的 深拷贝 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中…

LabVIEW多通道压力传感器实时动态检测

LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统&#xff0c;解决压阻式压力传感器温度补偿过程的复杂度&#xff0c;提高测量的准确性。通过自动轮询检测方法&#xff0c;结合硬件检测模型和多通道检测系统设计&#xff0c;本…

【动态规划专栏】专题三:简单多状态dp--------3.删除并获得点数

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

ios抓包Tunnel to......443

fiddler官网下载“CertMaker for iOS and Android”插件&#xff0c;官网插件&#xff1a;https://www.telerik.com/fiddler/add-ons 双击运行插件后&#xff0c;重启fiddler&#xff0c;ios重新安装证书即可

九州金榜|家庭教育小技巧

家庭教育对于孩子的发展至关重要&#xff0c;家长一定要重视孩子在家里的举动&#xff0c;同样孩子犯错&#xff0c;对于孩子批评也是有一定技巧&#xff0c;下面九州金榜家庭教育给大家分享一下关于在家庭教育中的一些小技巧&#xff0c;帮助大家怎样在家庭教育中面对孩子 1、…

字节一面 : post为什么会发送两次请求?

同源策略 在浏览器中&#xff0c;内容是很开放的&#xff0c;任何资源都可以接入其中&#xff0c;如 JavaScript 文件、图片、音频、视频等资源&#xff0c;甚至可以下载其他站点的可执行文件。 但也不是说浏览器就是完全自由的&#xff0c;如果不加以控制&#xff0c;就会出…

DPDK应该如何入门学习?

01 写在前面 我的读者当中应该有一部分人是做 DPDK 相关的&#xff0c;我自己虽然现在已经不做 DPDK 了&#xff0c;但对这块仍然有兴趣&#xff0c;今天这篇文章就来总结下 DPDK 的技术栈。注意&#xff1a;这篇文章是小白文&#xff0c;不适合大神哦。 文章从 DPDK 的产生背…

四.QT5工具安装和环境变量的配置

1.以管理员身份运行安装包 2.登录qt账号&#xff0c;点击【next】 3.选中同意 4.选择安装目录&#xff0c;注意不能有中文和空格 5.勾选 64位 mingw。点击【next】&#xff0c;等待安装完成 6.配置环境变量

QT基本组件

四、基本组件 Designer 设计师&#xff08;重点&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…

Java面向对象案例之家禽对象Poultry(3)

类主要结构图 抽象类&#xff1a;Poultry&#xff08;家禽作为父类&#xff09;子类&#xff1a;Chook&#xff08;鸡类&#xff09;、Duck&#xff08;鸭子类&#xff09;测试类&#xff1a;PoultryTest 类的方法图 代码示例 /*** 测试类*/ public class PoultryTest {public…

【STM32学习】——续上:软件SPI读写W25Q64SPI通信外设硬件SPI读写W25Q64

四、软件SPI读写W25Q64 工程思路与I2C类似&#xff0c;MySPI.c是通信底层&#xff0c;主要包括通信引脚封装、初始化、SPI通信的三个拼图&#xff08;起始、终止和交换一个字节&#xff09;&#xff1b;基于此文件建立W25Q64.c&#xff0c;调用MySPI三个拼图&#xff0c;拼接成…

Jmeter内置变量 vars 和props的使用详解

JMeter是一个功能强大的负载测试工具&#xff0c;它提供了许多有用的内置变量来支持测试过程。其中最常用的变量是 vars 和 props。 vars 变量 vars 变量是线程本地变量&#xff0c;它们只能在同一线程组内的所有线程中使用&#xff08;线程组内不同线程之间变量不共享&#…

(十二)【Jmeter】线程(Threads(Users))之setUp 线程组

简述 操作路径如下: 作用:在正式测试开始前执行预加载或预热操作,为测试做准备。配置:设置预加载或预热操作的采样器、循环次数等参数。使用场景:确保在正式测试开始前应用程序已经达到稳定状态,减少测试结果的偏差。优点:提供预加载或预热操作,确保测试的准确性。缺…

[newstarctf2023] --RE wp

AndroGenshin: rc4加密表&#xff0c;base64换表&#xff1a; 脚本梭就行 python username b"genshinimpact" base64_table [125, 239, 101, 151, 77, 163, 163, 110, 58, 230, 186, 206, 84, 84, 189, 193, 30, 63, 104, 178, 130, 211,164, 94, 75, 16, 32, 33…

SpringBoot启动报错:Failed to load property source from ‘file:/D:.....

SpringBoot启动报错&#xff1a;Failed to load property source from file:/D:… SpringBoot启动爆如图的错误 2024-02-22 20:57:42.865 ERROR 23024 --- [ restartedMain] o.s.boot.SpringApplication : Application run failedjava.lang.IllegalStateExce…

基于SpringBoot的教师宿舍管理系统设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的教师宿…

考研高数(高阶导数的计算)

1.归纳法 常见高阶导数 2.泰勒展开式 3.莱布尼兹公式 4.用导数定义证明导函数在某一点连续的例题

并发编程(2)基础篇-管程

4 共享模型之管程 本章内容 共享问题synchronized线程安全分析Monitorwait/notify线程状态转换活跃性Lock 4.1 共享带来的问题 4.1.1 小故事 老王&#xff08;操作系统&#xff09;有一个功能强大的算盘&#xff08;CPU&#xff09;&#xff0c;现在想把它租出去&#xff…

unity学习(22)——客户端与服务器合力完成注册功能(4)数据库化

单纯的账号密码这种非频繁读写&#xff0c;实现起来很简单的&#xff0c;游戏的属性信息到时候也许会比较麻烦。 思路&#xff1a;每次加入有新键值TryAdd&#xff0c;如果加入成功&#xff0c;直接重写账号密码文件即可。 C#JsonConvert.DeserializeObject反序列化与JsonCon…