Flutter 三: Dart
1 数据类型
-
数字(number) int double
- 字符串转换成 num int.parse(“1”) double.parse(“1”);
- double 四舍五入保留两位小数 toStringAsFixed(2) 返回值为string
- double 直接舍弃小数点后几位的数据 可使用字符串截取的方式
-
字符串(string)
- 单引号 双引号 三引号
- 三引号 可以输出文本格式 比如换行
-
布尔值(boolean)
-
列表(list)
- 一旦定义了 内容的类型 就不可变
- list内容是常量 添加const

-
集合(set)

- 映射(map)
- 符文(rune)
- 符号(Symbol)
- 数字(number) int double- 字符串转换成 num int.parse("1") double.parse("1");- double 四舍五入保留两位小数 toStringAsFixed(2) 返回值为string- double 直接舍弃小数点后几位的数据 可使用字符串截取的方式
//字符串转换成 num var a = int.parse("1");var b = double.parse("1");print(a);print(b);
//结果
//1
//1.0- 字符串(string)- 单引号 双引号 三引号- 三引号 可以输出文本格式 比如换行
var a = "aaa""bbb";print(a);a = 'aaa''bbb';print(a);a = '''aaa bbb''';print(a);
结果
aaabbb
aaabbb
aaa bbb- 列表(list)- 一旦定义了 内容的类型 就不可变- - list内容是常量 添加const
void main(){var list = [1,2,3];// list = ["1","2","3"]; // Error: A value of type 'String' can't be assigned to a variable of type 'int'.var cars = [ Car("TSLT"),Car("XRB")];print(cars);print(cars[0].name);print(cars[0].drive());var names = const ["TSLT","XRBS"]; //内容不可改变print(names);names[1] = "TSLC"; // Cannot modify an unmodifiable listprint(names);
}
class Car{var name;Car(this.name);bool drive(){print("${name}我着了...");return true;}
}结果[Instance of 'Car', Instance of 'Car']
TSLT
TSLT我着了...
true
[TSLT, XRBS]void main(){var a = {1,"2",3.4,Car(5),true};print(a);a.add("aaa");print(a);var b = Set();b.add(1);b.add("2");b.add(3.4);b.add(Car(5));b.add(true);print(b);// var c = const {1,"2",3.4,Car(5),true}; // Error: The element '3.4' does not have a primitive equality.var c = const {1,"你好",true}; // Error: The element '3.4' does not have a primitive equality.print(c);
}
结果
{1, 2, 3.4, Instance of 'Car', true}
{1, 2, 3.4, Instance of 'Car', true, aaa}
{1, 2, 3.4, Instance of 'Car', true}
{1, 你好, true}
2 var 关键字
- var 关键字一旦赋值类型即确定
void main(){var a = 1;var b = "hello";var c = Car();c.drive();print(a.runtimeType);print(b.runtimeType);print(c.runtimeType);
} class Car{void drive(){print("我跑了");}
}
结果
我跑了
int
String
Car
3 dynamic 和 Object
- Object是Dart所有对象的父类
- Object和dynamic声明变量 可改变类型
- dynamic 可使用对象类型的属性和方法 Object声明的对象只能用Object的属性和方法
void main(){Object a;a = "hello";print("a 的类型是 ${a.runtimeType}");a = 1;print("a 的变化后类型是 ${a.runtimeType}");dynamic b;b = 1;print("b 的类型是 ${b.runtimeType}");b = 1.1;print("b 的变化后类型是 ${b.runtimeType}");a = "hello";b = "world";print(b.length);// print(a.length); //报错 The getter 'length' isn't defined for the class 'Object'.
}
结果
a 的类型是 String
a 的变化后类型是 int
b 的类型是 int
b 的变化后类型是 double
5
4 final 和 const
- const 编译时赋值
- final 运行时 第一次使用时 赋值
void main(){final a;a = 1;print(a);// const b; // 报错 Error: The const variable 'b' must be initializedconst b = 2;print(b);
}
结果
1
2
5 空安全
void main(){Car? car;print(car?.drive());car = Car();print(car?.drive());
}
class Car{bool drive(){print("我着了...");return true;}
}
运行结果
lib/demo.dart:8:9: Warning: Operand of null-aware operation '?.' has type 'Car' which excludes null.- 'Car' is from 'package:demo/demo.dart' ('lib/demo.dart').print(car?.drive());^
null
我着了...
true
函数 (方法)
- 不声明返回值的 默认是dynamic
run(){print("我跑了");
}eat(){return "吃撑了";
}void main(){print(run());print(eat());
}
结果
我跑了
null
吃撑了
- 函数可以作为变量
var run = (){print("我跑了");
};var eat = (){return "吃撑了";
};void main(){print(run());print(eat());
}
结果
我跑了
null
吃撑了
- 函数可以作为参数
run(String name){print("${name}跑了");
}eat(String name){return "${name}吃撑了";
}see(var seeWho){seeWho("老六");
}void main(){var car = Car("安妮");car.who(run);see((var name)=>print(name));
}
class Car{var name;Car(this.name);who(var run){run(name);}
}运行结果:
安妮跑了
老六
- 可变函数
eat(String name,{String? food,int? num}){return "${name}吃${food}撑了${num}份";
}speak(String name,[String? and,String? chat]){return "${name}吃${and}${chat}";
}void main(){print(eat("张三"));print(eat("张三",food: "麻辣烫",num: 10));print(speak("张三"));print(speak("张三","李四"));print(speak("张三","李四","聊天"));
}运行结果:
张三吃null撑了null份
张三吃麻辣烫撑了10份
张三吃nullnull
张三吃李四null
张三吃李四聊天
- 扩展函数
- 常用类型转换 / 时间处理 / 或者Widget的扩展(例如padding)
- 多个扩展函数若已定义 不可重复定义 即函数名不可重复
- dynamic 不可使用扩展函数
/*** 扩展函数* 格式:* extension 函数名 on 类**/
extension toNum on String{int toInt(){return int.parse(this);}double toDouble(){return double.parse(this);}
}void main(){var a = "12".toInt();print(a);print(a.runtimeType);dynamic b = "12";
}结果:
12
int

- 类
- 默认构造函数
- 命名构造函数 Student2.fromJson()
import 'dart:convert';void main(){var student = Student("张三", "三年二班", 18, "2005-12-12 12:12:12");print("student>>${student}");var student1 = Student1("张三", "三年二班", 18, "2005-12-12 12:12:12");print("student1>>${student1}");var student11 = Student1.name("李四"); //命名构造函数print("student11>>${student11}");String jsonString = '{"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}';var student2 = Student2.fromJson(jsonString);print(student2.toString());
}class Student{//不添加构造函数 这些属性 会报错 或者可以加上?String name,classGrade;int age;String birthday;Student(this.name, this.classGrade, this.age, this.birthday);Map<String,dynamic> toJson(){return {'name':name,'classGrade':classGrade,'age':age,'birthday':birthday};}@overrideString toString() {return 'Student{name: $name, classGrade: $classGrade, age: $age, birthday: $birthday}';}
}class Student1{//不添加构造函数 这些属性 会报错 或者可以加上?String? name,classGrade;int? age;String? birthday;Student1(this.name, this.classGrade, this.age, this.birthday);Student1.name(this.name);@overrideString toString() {return 'Student1{name: $name, classGrade: $classGrade, age: $age, birthday: $birthday}';}
}class Student2{String name = "",classGrade = "";int age = 0;String birthday = "";//命名构造函数Student2.fromJson(String jsonStr){var json = jsonDecode(jsonStr);print(jsonStr);this.name = json['name'];this.classGrade = json['classGrade'];this.age = json['age'];this.birthday = json['birthday'];}@overrideString toString() {return 'Student2{name: $name, classGrade: $classGrade, age: $age, birthday: $birthday}';}
}运行结果:
student>>Student{name: 张三, classGrade: 三年二班, age: 18, birthday: 2005-12-12 12:12:12}
student1>>Student1{name: 张三, classGrade: 三年二班, age: 18, birthday: 2005-12-12 12:12:12}
student11>>Student1{name: 李四, classGrade: null, age: null, birthday: null}
{"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}
Student2{name: John, classGrade: 三年二班, age: 30, birthday: 2005-12-12 12:12:12}


- 常量构造函数
- 常量构造函数 const修饰构造函数
- 常量构造函数用const 修饰时 属性值一样 则对象相等
import 'dart:convert';class Student{String name;int age;Student(this.name, this.age);
}class Student1{final String name;final int age;const Student1(this.name, this.age);
}void main(){var student = Student("张三",18);var student0 = Student("张三",18);print(student.hashCode);print(student0.hashCode);print(student == student0);print("\n");var student1 = const Student1("张三",18);var student11 = const Student1("张三",18);var student12 = const Student1("张三",19);print(student1.hashCode);print(student11.hashCode);print(student12.hashCode);print(student1 == student11); //trueprint(student12 == student11); //false}结果:
333142976
1033297191
false87118132
87118132
590927718
true
false
- 工厂构造函数
import 'dart:convert';class Student{String? name;int? age;Student.init({String name ="",int age = 0}){this.name = name;this.age = age;}static Student instance = Student.init();factory Student(){return instance;}}void main(){var student = Student.instance;var student1 = Student.instance;print(student.hashCode);print(student1.hashCode);
}结果:
11925193
11925193
- 类
- 默认属性方法修饰符是public
- _下划线表示私有
- 单继承 多实现

class A{void printA(){print("A");}
}class B{void printA(){print("B");}
}abstract class M{void printM(){print("M");}
}abstract class N{void printN(){print("N");}
}interface class X{void printX(){print("X");}
}interface class Y{void printY(){print("Y");}
}
//单继承 多实现
class C extends A implements M,N,X,Y{@overridevoid printM() {// TODO: implement printM}@overridevoid printN() {// TODO: implement printN}@overridevoid printX() {// TODO: implement printX}@overridevoid printY() {// TODO: implement printY}}
- 类的混入
mixin class P{void printP(){print("P");}
}mixin class Q{void printQ(){print("Q");}
}class D with P,Q{void printD(){print("D");}
}void main(){var d = D();d.printD();d.printP();d.printQ();
}结果:
D
P
Q相关文章:
Flutter 三: Dart
1 数据类型 数字(number) int double 字符串转换成 num int.parse(“1”) double.parse(“1”);double 四舍五入保留两位小数 toStringAsFixed(2) 返回值为stringdouble 直接舍弃小数点后几位的数据 可使用字符串截取的方式 字符串(string) 单引号 双引号 三引号三引号 可以输…...
redis基本用法学习(C#调用FreeRedis操作redis)
FreeRedis属于常用的基于.net的redis客户端,EasyCaching中也提供适配FreeRedis的包。根据参考文献4中的说法,FreeRedis和CsRedis算是近亲(都是GitHub中账号为2881099下的开源项目),因此其用法特别相似。FreeRedis的主要…...
Postman接口测试(超详细整理)
常用的接口测试工具主要有以下几种 Postman:简单方便的接口调试工具,便于分享和协作。具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, …...
【深入解析spring cloud gateway】12 gateway参数调优与分析
本节主要对网关主要的一些参数做一些解释说明,并用压测工具测试一下网关的接口,通过压测来验证参数配置是否合理 一、连接池参数 参数示例 spring:application:name: gatewaycloud:gateway:# http连接设置httpclient:# 全局的响应超时时间,…...
Java继承,父类没有无参构造方法时,子类必须要显式调用父类的构造方法
在Java中,如果一个类没有定义任何构造函数,那么编译器会默认为这个类提供一个无参的构造函数。 这个隐式的构造函数在继承的时候,子类会在自己的构造方法里面默认的调用这个构造函数。 但是,如果我们在父类中定义了一个有参构造…...
Ubuntu 20.04使用Livox Mid-360
参考文章: Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一:Livox mid 360驱动安装与测试 前言: Livox mid360需要使用Livox-SDK2,而非Livox-SDK,以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部…...
C语言之冒泡排序
其实排序有很多的方法,比如:冒泡排序,插入排序,快速排序,归并排序,选择排序等。今天来讲一下最简单的排序:冒泡排序。这种排序的方法效率极其低下。 假设有一个整型数组: int arr[…...
在Linux上安装NVM(Node Version Manager)
在Linux系统上,使用NVM(Node Version Manager)是管理和切换Node.js版本的一种便捷方式。以下是在Linux上安装NVM的步骤: 1. 下载并安装NVM 使用curl或wget下载并运行NVM的安装脚本。选择一种方式执行以下命令之一: …...
常用两种Linux命令生成器
在Linux中,可以使用多种命令来生成随机密码。以下是其中两种常用的命令: 1.pwgen:这个命令可以生成随机、无意义的但容易发音的密码。生成的密码可以只包含小写字母、大小写混合或数字。大写字母和数字会以一种便于记忆的方式放置࿰…...
【OAuth2】授权框架的四种授权方式详解
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《OAuth 2》。🎯🎯 …...
AI数字人不间断直播是什么?数字人直播带货如何搭建?
随着电商行业的崛起,数字人直播成为了最为热门的直播方式之一。数字人直播利用AI技术创建出的数字人进行直播,给观众带来了全新的视觉体验。 一、AI数字人无限播(数字人SaaS系统VX:zhibo175)是什么? AI数字…...
真菌基因组研究高分策略(二):比较基因组揭示寄主外生菌根真菌基因组的动态进化
在表征外生菌根(ECM)真菌的“共生工具包”方面的研究已经取得了重大进展,但宿主特异性如何被编码到ECM真菌基因组中仍知之甚少。2021年发表于《New Phytologist》期刊的文章对ECM真菌宿主特异性和通用性进行了比较基因组分析,重点…...
uni-app之HelloWorld实现
锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…...
CVE-2023-49898 Apache incubator-streampark 远程命令执行漏洞
项目介绍 Apache Flink 和 Apache Spark 被广泛用作下一代大数据流计算引擎。基于大量优秀经验结合最佳实践,我们将任务部署和运行时参数提取到配置文件中。这样,带有开箱即用连接器的易于使用的 RuntimeContext 将带来更轻松、更高效的任务开发体验。它…...
即将来临的2024年,汽车战场再起波澜?
我们来简要概况一下11月主流车企的销量表现: 根据数据显示,11月吉利集团总销量29.32万辆,同比增长28%。这在当月国内主流车企中综合实力凌厉,可谓表现得体。而与吉利直接竞争的比亚迪,尽管数据未公布,但我们…...
Python 爬虫之下载视频(二)
爬取某Y的视频链接和标题 文章目录 爬取某Y的视频链接和标题前言一、基本思路二、程序解析阶段三、程序处理阶段总结 前言 这篇内容就简单给大家写个如何从网页上爬取某B主 主页 页面上所有的视频链接和视频标题。 这篇是基础好好看,下篇会根据这篇的结果做一个批…...
智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定…...
[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计
目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试(非常重要) 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计,第一个摆在我们面前的就说四肢的朝向问题,如下图,我们是…...
用友U8+CRM help2 任意文件读取漏洞复现
0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 help2接口处存在任意文件读取漏洞,攻击者通过漏洞可以获取到服…...
freeRTOS实时操作系统学习笔记
温馨提示:点击图片查看大图更清晰 —————————————————————————————↑↑↑上方资源下载后可获取xmind原文件。 1、freeRTOS移植和配置脑图 2、内核源码学习...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...
