Flutter学习4 - Dart数据类型

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(); //静态类型检查时会报错
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ bfs 的状态表示(六十二)【第九篇】

今天我们来学习一下bfs的复杂状态表示 1.bfs状态表示 无论是深度优先搜索还是广度优先搜索&#xff0c;搜索的过程均会建立一棵 搜索树&#xff0c;搜索树上的每一个结点都是一个 状态&#xff0c;而搜索的过程又可以看作是 状态的转移。 对于 BFS&#xff0c;搜索过程中产生…

力扣 309. 买卖股票的最佳时机含冷冻期

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ C题解&#xff1a;动态规划 状态1&#xff1a;表示持有股票。更新为之前持有股票&#xff08;dp[i-1][0]&#xff09;或者不持有股票且不处于冷冻期后买入&…

【网络安全】漏洞挖掘入门教程(非常详细),小白是如何挖漏洞(技巧篇)从零基础入门到精通!

温馨提示&#xff1a; 初学者最好不要上手就去搞漏洞挖掘&#xff0c;因为漏洞挖掘需要很多的系统基础知识和一些理论知识做铺垫&#xff0c;而且难度较大…… 较合理的途径应该从漏洞利用入手&#xff0c;不妨分析一些公开的CVE漏洞。很多漏洞都有比较好的资料&#xff0c;分…

Windows Server 2012 安装

1.镜像安装 镜像安装:Windows Server 2012 2.安装过程(直接以图的形式呈现) 2012激活秘钥:J7TJK-NQPGQ-Q7VRH-G3B93-2WCQD

利用RBI(Remote Browser Isolation)技术访问ChatGPT

系统组网图 #mermaid-svg-Bza2puvd8MudMbqR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Bza2puvd8MudMbqR .error-icon{fill:#552222;}#mermaid-svg-Bza2puvd8MudMbqR .error-text{fill:#552222;stroke:#552222;…

VMware ESXi 8.0的安装、配置、使用

VMware ESXi 8.0的安装、配置、使用 ESXi的安装与配置下载镜像安装网络配置 Web控制台的管理操作激活开启直通网络配置修改电源模式创建虚拟机 其他ESXI秘钥克隆虚拟机 ESXi的安装与配置 下载镜像 官网&#xff1a;https://www.vmware.com/ 文档&#xff1a;https://docs.vm…

Java基础(二十六):Java8 Stream流及Optional类

Java基础系列文章 Java基础(一)&#xff1a;语言概述 Java基础(二)&#xff1a;原码、反码、补码及进制之间的运算 Java基础(三)&#xff1a;数据类型与进制 Java基础(四)&#xff1a;逻辑运算符和位运算符 Java基础(五)&#xff1a;流程控制语句 Java基础(六)&#xff1…

外汇天眼:交易讲究时机,不要在这几个时间交易

每个交易者都想知道&#xff0c;什么时候是入场买卖的最好时机。 到底是1.1800入场呢&#xff1f; 还是等到1.1900&#xff1f; 但是&#xff0c;交易中不仅仅是关于从哪里入场&#xff0c;同样的&#xff0c;知道什么时候不去交易也是非常重要的。 这听起来像是一回事&#x…

私房菜|私房菜定制上门服务系统|基于springboot+vue私房菜定制上门服务系统设计与实现(源码+数据库+文档)

私房菜定制上门服务系统目录 目录 基于springbootvue私房菜定制上门服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;菜品管理 &#xff08;2&#xff09;公告管理 &#xff08;3&#xff09; 厨师管理 2、用…

04 动力云客之登录后获取用户信息+JWT存进Redis+Filter验证Token + token续期

1. 登录后获取用户信息 非常好实现. 只要新建一个controller, 并调用SS提供的Authentication对象即可 package com.sunsplanter.controller;RestController public class UserController {GetMapping(value "api/login/info")public R loginInfo(Authentication a…

IO进程线程day5作业

1、使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源 代码&#xff1a; #include<myhead.h>//定义文件拷贝函数 int copy_file(int start,int len) {int srcfd,destfd;//以只读的形…

MySQL 安装步骤

下载地址&#xff1a;https://downloads.mysql.com/archives/community/&#xff0c; 选择第二个 将下载的压缩包解压到自己想要放到的目录下&#xff08;路径中最好不要有中文&#xff09; 一、添加环境变量 环境变量里面有很多选项&#xff0c;这里我们只用到Path这个参数…

微信小程序错误----config is not defined

微信小程序出错 请求头发生错误 修改 options.header {// 为请求头对象添加 token 验证的 Authorization 字段Access-Token: token,platform: MP-WEIXIN,// 保留原有的 header...options.header,}

【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间两数之和辅助哈希使用map存储出现过的值,key为值大小,value为下标位置,…

Vue+SpringBoot打造超市商品管理系统

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

伦敦金行情分析需要学习吗?

对于伦敦金交易来说&#xff0c;目前大致分成两派&#xff0c;一派是实干派&#xff0c;认为做伦敦金交易重要的是实战&#xff0c;不需要学习太多东西&#xff0c;否则容易被理论知识所局限。另一派则是强调学习&#xff0c;没有理论知识&#xff0c;投资者很难做好伦敦金交易…

什么是接口测试?为什么要做接口测试?

1. 什么是接口测试&#xff1f;为什么要做接口测试&#xff1f; 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互…

Web自动化测试 Selenium 1/3

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Spring Framework

Spring Framework Spring 是一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;如下图所示&#xff1a; 一、Core Container Spring 框架的核心模…

Atcoder ABC341 B - Foreign Exchange

Foreign Exchange&#xff08;外汇&#xff09; 时间限制&#xff1a;2s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例输入1…