Flutter系列教程之(2)——Dart语言快速入门
目录
1.变量与类型
1.1 num类型
1.2 String类型
1.3 Object与Dynamic
1.4 类型判断/转换
1.5 变量和常量
2.方法/函数
3.类、接口、抽象类
3.1 类
3.2 接口
4.集合
4.1 List
4.2 Set
4.3 Map
5.总结
Dart语言的语法和Kotlin、Java有类似之处,这里就通过对比Java和Kotlin来快速入门Dart语言
1.变量与类型
1.1 num类型
基础常见的类型有 num (分为 int 和 double ) String bool , Dart 语言中的没有 float 、 short , long 类型,注意布尔类型为 bool 不是 boolean
与Java不同,Dart语言中的类型尽管是小写,但是其实是一个类,没有赋值的时候为null,与Java中包装类相同
int b1;
print(b1);//输出为null
Dart特有整除运算符~/,两个int相除并不是得到int类型的数值,而是double类型
print(300 / 100);//输出为3.0
print(6 ~/ 5 );//输出为1
num类型常用的方法:
main() {print(3.141592653.toStringAsFixed(3)); //3.142 保留有效数字print(6.6.floor());//6向下取整print((-6.6).ceil()); //-6 向上取整print(9.9.ceil()); //10 向上取整print(666.6.round()); //667 四舍五入print((-666.6).abs()); // 666.6 取绝对值print(666.6.toInt()); //666 转化成int,这中toInt、toDouble和Kotlin类似print(999.isEven); //false 是否是偶数print(999.isOdd); //true 是否是奇数print(666.6.toString()); //666.6 转化成字符串
}
1.2 String类型
String类型的特性和Kotlin差不多,支持单引号、双引号、三引号以及$字符串模板用法
1.3 Object与Dynamic
和Java一样,Object是所有对象的父类,而Dynamic是一种特殊的类型,主要用于不确定的类型
1.4 类型判断/转换
Dart语言与Kotlin一样,具有类型推导功能
如:
var b = true;//b变量的类型为bool
类型检查(is和is!)和强制类型转换(as)
main() {int number = 100;double distance = 200.5;num age = 18;print(number is num);//trueprint(distance is! int);//trueprint(age as int);//18
}
1.5 变量和常量
Dart中,变量可以使用var关键字,会自动的进行类型推导,如果在使用var定义了一个变量,并没有初始化赋值,这个变量的类型是会随着赋值的类型而改变(dynamic类型的特点)
void main() {var num;num = 123;print(num is int);/truenum ="xx";print(num is String);//truevar t = "xx";t = 123; //IDE会提示错误
}
const和final都是定义常量的关键字,const是编译期就能初始化(相当于Kotlin中的final val,而final是运行期初始化(相当于Kotlin中的val)
2.方法/函数
这里方法其实与Java中非常类似,这里就提及Dart中的方法比较特殊几点
Dart中的方法格式和Java中十分类似,基本格式为
返回值 方法名(参数类型 参数名...)
值得一提的是,返回值并不是必须的(JavaScript的语言特性?),你可以省略不写,但是仍可以使用return返回数值,建议实际开发中不要这样写,你懂得...
当然,如果返回值为空,你可以省事不写或者是定义返回值为void
void main{...
}
//与上面的相同
main{...
}
Dart中可以使用箭头函数,与Java和Kotlin中的lambda方式->很像
main() => print("hello world");
比较特殊的是,Dart中支持参数默认赋值以及命名参数(Kotlin中也有),然后值得一提的是,Dart中并不支持函数重载操作,包括构造函数
普通方法定义:
num sum(int a,int b){print(a+b);
}
特殊定义:
num sum({int a,int b}){print(a);print(b);
}
个人感觉好像是使用了Json对象作为了参数类型,之后调用的时候参数可选,但是得标明参数名
main{sum(a:1);sum(b:2);sum(1,2);//IDE会报错sum(a:1,b:2);
}
上面说了,{}可以看做为是一种Json类型,所以,我们可以将其和普通的类型组合起来构造参数列表
num sum(int c,{int a,int b}){print(a);print(b);
}
3.类、接口、抽象类
3.1 类
与Java和Kotlin一样,Dart也是通过class关键字来定义个类
class Person {var name;//隐藏了默认的无参构造函数Person();
}
//等价于:
class Person {var name;Person();//一般把与类名相同的函数称为主构造函数
}
//等价于
class Person {var name;Person(){}
}class Person {final String name;final int age;Person(this.name, this.age);//显式声明有参主构造函数Person();//编译异常,注意: dart不支持同时重载多个构造函数。
}
在之前提及了构造函数不能被重载的概念,但实际很多情况都是要根据不同的参数列表来实例化一个类对象,不过好在Dart有个命名构造函数的概念,我们可以利用它来实现曲线救国。
class Person {final String name;int age;Person(this.name, this.age);Person.withName(this.name);//通过类名.函数名形式来定义命名构造函数withName。只需要name参数就能创建对象,//如果没有命名构造函数,在其他语言中,我们一般使用函数重载的方式实现。
}main () {var person = Person('mikyou', 18);//通过主构造函数创建对象var personWithName = Person.withName('mikyou');//通过命名构造函数创建对象
}
重定向构造函数:
有时候我们定义了个参数列表比较全的构造方法,并且某些参数是具有默认值,使用的时候可以省略某些参数,这种情况下,我们就可以使用重定向构造函数来达到我们的效果,我们使用:来实现,如:
class Person{String name;int age;Person(this.name,this.age);Person.withName(String name):this(name,18);
}main{var person = Person.withName("小红");//默认小红为18岁
}
Dart中的继承也是使用extends关键字
class Person{String name;int age;//含有默认的构造函数
}
//继承
class Student extends Person{}
3.2 接口
需要注意的是,Dart中并没有接口对应的关键字interface,如果我们想要实现某个接口,得将某个类声明为抽象类,并定义好接口方法,之后通过implements关键字去实现该类的接口方法即可(有点类似实现抽象类的感觉)
abstract class OnClickListener{void onClick();
}class View implements OnClickListener{@overridevoid onClick() {}}
4.集合
4.1 List
Dart中的List和数组有点像,List的初始化方式如下所示:
List<String> colorList = ['red', 'yellow', 'blue', 'green'];//直接使用[]形式初始化
var colorList = <String> ['red', 'yellow', 'blue', 'green'];
常用的方法其实挺多的,打个.就可以看到了,这里也就不多提了
遍历方法:
main() {List<String> colorList = ['red', 'yellow', 'blue', 'green'];//for-i遍历 for(var i = 0; i < colorList.length; i++) {//可以使用var或int print(colorList[i]); } //forEach遍历 colorList.forEach((color) => print(color));//forEach的参数为Function. =>使用了箭头函数 //for-in遍历 for(var color in colorList) {print(color); } //while+iterator迭代器遍历,类似Java中的iteator while(colorList.iterator.moveNext()) { print(colorList.iterator.current); }
}
4.2 Set
集合Set和列表List的区别在于 集合中的元素是不能重复 的。所以添加重复的元素时会返回false,表示添加不成功.
main() { Set<String> colorSet= {'red', 'yellow', 'blue', 'green'};//直接使用{}形式初始化 var colorList = <String> {'red', 'yellow', 'blue', 'green'};
}
Dart中可使用交、并、补集:
main() { var colorSet1 = {'red', 'yellow', 'blue', 'green'}; var colorSet2 = {'black', 'yellow', 'blue', 'green', 'white'}; print(colorSet1.intersection(colorSet2));//交集-->输出: {'yellow', 'blue', 'green'} print(colorSet1.union(colorSet2));//并集--->输出: {'black', 'red', 'yellow', 'blue', 'green', 'white'} print(colorSet1.difference(colorSet2));//补集--->输出: {'red'}
}
遍历方式与List一样,这里不多提
4.3 Map
初始化方式:
main() { Map<String, int> colorMap = {'white': 0xffffffff, 'black':0xff000000};//使用{key:value}形式初始化 var colorMap = <String, int>{'white': 0xffffffff, 'black':0xff000000};
}
遍历:
main() { Map<String, int> colorMap = {'white': 0xffffffff, 'black':0xff000000}; //for-each key-value colorMap.forEach((key, value) => print('color is $key, color value is $value'));
}
List转为Map:4.4 集合常用操作符
main() {List<String> colorList = ['red', 'yellow', 'blue', 'green'];//forEach箭头函数遍历colorList.forEach((color) => {print(color)});colorList.forEach((color) => print(color)); //箭头函数遍历,如果箭头函数内部只有一个表达式可以省略大括号//map函数的使用,输出以,分隔的字符串print(colorList.map((color) => '$color').join(","));//every函数的使用,判断里面的元素是否都满足条件,返回值为true/falseprint(colorList.every((color) => color == 'red'));//sort函数的使用List<int> numbers = [0, 3, 1, 2, 7, 12, 2, 4];numbers.sort((num1, num2) => num1 - num2); //升序排序numbers.sort((num1, num2) => num2 - num1); //降序排序print(numbers);//where函数使用,相当于Kotlin中的filter操作符,返回符合条件元素的集合print(numbers.where((num) => num > 6));//firstWhere函数的使用,相当于Kotlin中的find操作符,返回符合条件的第一个元素,如果没找到返回nullprint(numbers.firstWhere((num) => num == 5, orElse: () => -1)); //注意: 如果没有找到,执行orElse代码块,可返回一个指定的默认值//singleWhere函数的使用,返回符合条件的第一个元素,如果没找到返回null,但是前提是集合中只有一个符合条件的元素, 否则就会抛出异常print(numbers.singleWhere((num) => num == 4, orElse: () => -1)); //注意: 如果没有找到,执行orElse代码块,可返回一个指定的默认值//take(n)、skip(n)函数的使用,take(n)表示取当前集合前n个元素, skip(n)表示跳过前n个元素,然后取剩余所有的元素print(numbers.take(5).skip(2));//List.from函数的使用,从给定集合中创建一个新的集合,相当于clone一个集合print(List.from(numbers));//expand函数的使用, 将集合一个元素扩展成多个元素或者将多个元素组成二维数组展开成平铺一个一位数组var pair = [[1, 2],[3, 4]];print('flatten list: ${pair.expand((pair) => pair)}');var inputs = [1, 2, 3];print('duplicated list: ${inputs.expand((number) =>[number,number,number])}');
}
5.总结
- 函数不能重载
- 构造函数不能重载,但可以用命名构造函数来变相实现重载的功能
- 方法返回值可以省略,但仍可以使用return返回数值(JS特性)
- 函数参数有个特殊的类型{}(Json类型?)
- Dart中没有接口,需要使用抽象类来实现接口
相关文章:
Flutter系列教程之(2)——Dart语言快速入门
目录 1.变量与类型 1.1 num类型 1.2 String类型 1.3 Object与Dynamic 1.4 类型判断/转换 1.5 变量和常量 2.方法/函数 3.类、接口、抽象类 3.1 类 3.2 接口 4.集合 4.1 List 4.2 Set 4.3 Map 5.总结 Dart语言的语法和Kotlin、Java有类似之处,这里就通…...
pyecharts介绍
文章目录 介绍安装pyecharts基本使用全局配置选项 折线图相关配置地图模块使用柱状图使用 介绍 echarts虑是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可,而Pyhon是门富有表达力的语言&a…...
前缀和相关题目记录(未完待续...)
1 前缀和 一维前缀和是指对于一个数组 a a a,我们定义一个新的数组 s s s,其中每个元素 s [ i ] s[i] s[i] 表示从数组开头到第 i i i 个元素的累加和: s [ i ] a [ 1 ] a [ 2 ] ⋯ a [ i ] ∑ j 1 i a [ j ] s[i] a[1] a[2] \…...
Https解决了Http的哪些问题
部分内容来源:小林coding 详细解析 Http的风险 HTTP 由于是明文传输,所以安全上存在以下三个风险: 1.窃听风险 比如通信链路上可以获取通信内容,用户号容易没。 2.篡改风险 比如强制植入垃圾广告,视觉污染&#…...
OpenCV给图像添加噪声
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 如果你已经有了一张干净的图像,并希望通过编程方式向其添加噪声,可以使用 OpenCV 来实现这一点。以下是一个简单的例子&a…...
湖北中医药大学谱度众合(武汉)生命科技有限公司研究生工作站揭牌
2025年2月11日,湖北中医药大学&谱度众合(武汉)生命科技有限公司研究生工作站揭牌仪式在武汉生物技术研究院一楼101会议室举行,湖北中医药大学研究生院院长刘娅教授、基础医学院院长孔明望教授、基础医学院赵敏教授、基础医学院…...
欢乐力扣:快乐数
文章目录 1、题目描述2、思路1代码 1、题目描述 快乐数。 编写一个算法来判断一个数 n 是不是快乐数。 快乐数定义为:对于一个正整数,每次不断将其转化成 每位数字的平方和。 判断是否最终和会为1,是1就是快乐数,否则不是。 …...
【聊天室后端服务器开发】功能设计-框架与微服务
服务器功能设计 微服务思想应用 微服务架构 主要组成分析 客户端 客户端通过 HTTP 协议与网关进行交互,进行操作如用户注册、好友申请等客户端只需要知道网关的地址,无需关心后端服务的具体实现 网关 作为系统的统一入口,网关负责接收客…...
国标28181协议在智联视频超融合平台中的接入方法
一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是国内视频行业最重要的国家标准,目前有三个版本: 2011 年:推出 GB/T 28181-2011 版本,为安防行业的前端设备、平…...
让网页“浪“起来:打造会呼吸的波浪背景
每次打开那些让人眼前一亮的网页时,你是否有注意到那些看似随波逐流的动态背景?今天咱们不聊高深的技术,就用最朴素的CSS,来解锁这个让页面瞬间鲜活的秘籍。无需JavaScript,不用复杂框架,准备好一杯咖啡&am…...
linux-多进程基础(1) 程序、进程、多道程序、并发与并行、进程相关命令,fork
程序是什么 程序是包含一系列信息的文件。这些信息描述了如何在运行时创建一个进程,包含二进制格式标识、机器语言指令、程序入口地址、数据、符号表及重定位表、共享库信息及其他信息 二进制格式标识,每个程序包含了描述可执行文件的元信息(是否可读之…...
美颜相机1.0
项目开发步骤 1 界面开发 美颜相机界面构成: 标题 尺寸 关闭方式 位置 可视化 2 创建主函数调用界面方法 3 添加两个面板 一个是按钮面板一个是图片面板 用JPanel 4 添加按钮到按钮面吧【注意:此时要用初始化按钮面板的方法initBtnPanel 并且将按钮添…...
Docker内存芭蕾:优雅调整容器内存的极限艺术
title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “🩰💥📊” 当你的容器变成内存吸血鬼时… 🚀 完美内存编排示范 📜 智能内存管家脚本…...
gitlab初次登录为什么登不上去
今天又写了一次gitlab安装后,第一次登录的问题。 gitlab工作笔记_gitlab默认用户名密码-CSDN博客 因为又掉这个坑里了。 # 为什么第一次登录这么难? 第一是因为gitlab启动的时间很长,有时候以为装错了。 第二是初始密码,如果…...
单链表相关操作(基于C语言)
文章目录 单链表定义版本一(可自己选择是否含头节点)创建单链表打印单链表对单链表进行冒泡排序删除单链表中值为key的节点求单链表表长在单链表位序为i的位置插入新元素e 单链表定义 typedef struct node {int data;struct node* next; }LinkNode,*LinkList;版本一(可自己选择…...
SPRING10_SPRING的生命周期流程图
经过前面使用三大后置处理器BeanPostProcessor、BeanFactoryPostProcessor、InitializingBean对创建Bean流程中的干扰,梳理出SPRING的生命周期流程图如下...
从零到一学习c++(基础篇--筑基期十一-类)
从零到一学习C(基础篇) 作者:羡鱼肘子 温馨提示1:本篇是记录我的学习经历,会有不少片面的认知,万分期待您的指正。 温馨提示2:本篇会尽量用更加通俗的语言介绍c的基础,用通俗的语言去…...
Java String 类
Java String 类常用方法详解 在 Java 编程里,字符串操作十分常见,而 String 类作为 Java 标准库的核心类,用于表示不可变的字符序列。任何对字符串的修改操作都会返回一个新的字符串对象,不会改变原始字符串。本文将详细介绍 Str…...
P8665 [蓝桥杯 2018 省 A] 航班时间
P8665 [蓝桥杯 2018 省 A] 航班时间 题目代码分析 题目 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <queue>#include <cctype> using namespace std; int t;…...
Vue3项目与pnpm使用教程
文章目录 Vue3项目与pnpm使用教程一、pnpm简介二、安装pnpm三、创建Vue3项目四、运行Vue3项目五、管理项目依赖六、配置pnpm七、使用pnpm的额外功能八、总结 Vue3项目与pnpm使用教程 一、pnpm简介 pnpm是一个高性能的Node.js包管理工具,相较于npm和yarn࿰…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
