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࿰…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
