Flutter的Dart语法入门

文章目录

  • 前言
  • 1. 类型声明
  • 2. 数据类型
    • 2.1 基本数据类型
      • 常量
    • 2.2 String
    • 2.3 集合
    • 2.4 unicode
  • 3. Dart函数特征
    • 3.1 可变参数列表和默认入参
    • 3.2 匿名函数
    • 3.3 typedef
  • 4. Dart面向对象
    • 4.1 构造函数
    • 4.2 访问权限
    • 4.3 类的继承
  • 参考资料
  • 附录

前言

每个语言都有控制流语句就不写测试代码了。

Win11代码测试方式:
你要把电脑中的flutter和dart环境都安装上,然后在Android Studio中新建一个Dart项目或Flutter项目即可测试
没有安装的可以参考本文:https://blog.csdn.net/qq_41872247/article/details/139375636

新建一个dart文件,void main就可以在编译器运行。
在这里插入图片描述

1. 类型声明

dart支持以下几种类型声明方式:

  • 和Java一模一样的强类型声明。
  • var开头直接声明一个对象,他会自己做类型推断(同kotlin或者js)。
  • dynamic声明,可变类型对象,就是可以动态赋值为不同的类型,编译时对于dynamic声明的对象不做类型检查。
  • Object声明,同dynamic,但是编译时会将类型确定为Object,除了Object自带的方法以外无法通过编译(其实就是Java的Object)。
void main() {Obj obj = new Obj();obj.func();var obj1 = new Obj();obj1.func();var obj2;obj2 = new Obj1();obj2.funcc();dynamic obj3 = Obj();obj3.func();obj3 = Obj1();//obj3.func(); 可以编译,但是无法运行obj3.funcc();Object obj4 = 3;//obj4 = obj4 + 4;  通不过编译obj4 = "asdqwd";//obj4 = obj4.subString(0, 3) 通不过编译obj4 = [3, 6, 9];print(obj4);
}class Obj {void func() {print("test");}
}class Obj1 {void funcc() {print("test1");}
}

2. 数据类型

2.1 基本数据类型

在java里面,int,double这种基本数据类型是没有自带方法的,只有封装的Int和Double对象才有对应的方法,dart省略了这一步,直接就可以int,double,boolean进行一些方法处理。

Dart取消了使用率不高的byte,short,long这三个基本数据类型。

void main() {//int和double都继承num.dart这个类,里面就有相关的api。int a = -4;print(a);print(a.toDouble());print(a.abs());//long a = 1; 无法过编译//short a = 1; 无法过编译//byte a = 1; 无法过编译
}

不过,虽然自动封装了对应的API,但是仍然是基础数据类型,是值传递。

void main() {int a = -4;Obj o = new Obj();test(a);test(o.a);print(a);  // -4print(o.a);  // -4test2(o);print(o.a); // -1
}void test(int num) {num = num + 3;
}void test2(Obj obj) {obj.a = obj.a + 3;
}class Obj {int a = -4;
}

常量

Dart同时使用const关键字和final关键字,且如果是基础数据类型的话就不需要声明类型,他会自行做类型推断。
const关键字声明的是常量
final声明的是可以定义一次的变量

const a = 1; // 声明时不需要写var,也不需要写int
//const Obj o = Obj(); 编译报错
final a1 = 1;
final Obj o1 = Obj();
late final a2; // 后续再赋值void main() {//print(a2); 运行报错//a1 = 3; 编译报错a2 = 3;
}class Obj {int a = 4;
}

2.2 String

  • String可以使用单引号,也可以使用双引号,当使用双引号的String时,内部的单引号就不需要转义可以直接使用,反之也一样。
  • String支持用取地址符(&)拼装变量,和kotlin的一样
  • 多个常量String拼接的时候不需要+,直接拼就行
  • String前面加上字符r,会自动忽略字符串的所有转义符。
void main() {String str0 = "外侧是双引号,内侧'单引号'不用转义符";String str1 = '外侧是单引号,内侧"双引号"不用转义符';String str2 = "外侧是双引号,内侧\"双引号\"需要用转义符";String str3 = "外侧是单引号,内侧\'单引号\'需要用转义符";String str4 = str0 + str1 + "  $str0";String str5 = 'awdqwd''qwdqwd''qwdqwdqwd''qwdqwdqwd';String str6 = "adqwd""qwdqwdqwd";String str7 = "qww\nqwe";String str8 = r"qww\nwww";
}

2.3 集合

  • List和数组融合,可以直接用[]创建,不需要new List(语法优化)。
  • List内部没有类型检测,可以任意放东西进去。
  • Map采用字典的方式,可以直接用{}创建,可以用[]直接修改map。(语法优化)
  • 集合创建的时候可以用上const关键字,此时里面的数据类型只能是const类型,也就是常量。
void main() {List list = [];list.add("qqq");list.add(1);list.add(new Obj());Map map = {'qq': 'xiaobing', 'qqq':3, 'qqq1': new Obj()};map['12'] = 3;print(map);var a = new Obj();Map map1 = const {'qq': 'xiaobing', 'qqq':3, 'qqq1': a}; // a编译不通过
}class Obj{}

2.4 unicode

  • 可以输入String中不支持的一些字符
void main() {Runes runes = new Runes('\u{1f661} \u6211');print(String.fromCharCodes(runes));
}

3. Dart函数特征

Dart的函数语法模式和Java类似,也是一样的返回类型在前,参数列表中也是类型在前的写法。

void main() {print(test("a", "b")); // ab
}String test(String a, String b) {return a + b;
}

同时Dart语法中的参数是kotlin同款的空类型判断的,在参数类型后面加上?表示该参数可以传空值,不加就不能传了。

void main() {print(test1("a", null));
}
// ?表示b这个参数可以传空
String? test1(String a, String? b) {if(b != null) {return a+b;}return null; // 返回类型加上?后可以返回空
}

3.1 可变参数列表和默认入参

Dart不支持Java模式的函数重载,即函数名相同,参数列表或返回类型不同的多个函数同时存在,但是对应的是,Dart的函数支持可变参数列表,可以直接自定义必须要传入的参数和可以传也可以不传的参数,用花括号{}。

void main() {print(test2("a", b: "b", c: null));
}// 在花括号里面的参数就是可以传也可以不传的,但是加了required关键字的还是必须要传的
String test2(String a, {required String b, required String? c, String d="dddd", String? e}) {var str = "";if(c != null) {str += c;}if(e != null) {str += e;}return a + b + d + str;
}// 同时,作为可变参数,required,?,默认值三个模式中至少要有一个,都没有的话就过不了编译
String test20(String a, {String b}) { //编译过不去return a;
}

中括号模式:也能用做可变参数列表,但是不支持required关键字

void main() {print(test3("a"));
}String test3(String a, [String b="bb", String? c="ccc", String? d]) {return a;
}
// 同上,都没有过不了编译
String test30(String a, [String b]) { return a;
}

3.2 匿名函数

和其他语法的万物皆可对象是一个道理,可以单独将一个函数声明成对象,只是具体写法上有不同,用箭头表明。

void main() {// 单行直接用箭头,返回类型自动推测var a = (int a, int b) => a + b;print(a(1, 2));// 多行用花括号,返回类型自动推测var b = (int a, int b) {a = a + 1;return a + b;};print(b(1, 2));//无返回类型Function c = () => print("ccc");//print(c()); // 编译过不去,因为c返回类型是voidc();
}

当然你懂得,函数本身当然也可以作为函数的入参

void main() {test(() => print("a"), () => print("bb"));
}void test(Function a, Function b) {a();b();
}

3.3 typedef

typedef可以让你将一个特定入参列表的匿名函数作为一个对象的类型,然后再实际的来定义他的具体功能。

typedef实际名称叫函数签名,不好理解的话你可以将其理解成只有一个方法的接口。

void main() {fun1 f1 = (int a) {print("我是f1,a=" + a.toString());};// 编译过不去,因为fun1是一个只有一个入参的方法
/*  fun1 f2 = (int a, int b) {print("我是f2");};*/
}
typedef fun1(int a);typedef fun2(int a, int b);

有了这个typedef后,你在定义函数入参的时候就能更精确入参的类型了。

void main() {fun1 f1 = (int a) {print("我是f1,a=" + a.toString());};test(f1);
}typedef fun1(int a);void test(fun1 f1) {f1(555);
}

4. Dart面向对象

Dart的类的定义模式和Java基本一样。

4.1 构造函数

首先,Dart为了方便使用Java的程序员使用Dart语法,所以他支持Java的同款构造函数,只是不支持重载构造函数。

void main() {// 三种构造函数都能用var userInfo1 = UserInfo1.con2();userInfo1 = UserInfo1("aa");userInfo1 = UserInfo1.con1("aaa", "11", "id");
}// 支持java的构造方法形式
class UserInfo {late String name;String? age;String id = "";UserInfo(String name, String age) {this.age = age;this.name = name;}
}

对于Dart语言本身,他的构造方法有个更简单的写法
与此同时,为了弥补不能重载构造函数的问题,Dart语言引入了建造者模式的设计模式,允许通过重命名的方式来设置多个构造函数。

//Dart自己的构造方法形式
class UserInfo1 {late String name;String? age;String id;// 构造函数直接填入成员变量,不需要再写赋值,是语法糖UserInfo1(this.name, {this.age, this.id = ""}); UserInfo1.con1(this.name, this.age, this.id); //命名为con1的另一个构造方法UserInfo1.con2() : name = "1", age = "2", id = "3"; // 重命名,但是拥有默认实现
}

4.2 访问权限

Dart中没有public potect和private关键字,而是通过在成员变量前面增加_来标记他为私有成员变量,

注意,Dart的私有成员变量指的是本文件以外的对象无法访问,和Java中的本对象以外的对象无法访问不完全相同。

与此同时,对于私有成员变量他的set和get方法写法也略微有区别。

class PrivateUserInfo {String? name;String? _age; //私有化,但是dart的私有化是该文件内可以访问,其他文件不能访问PrivateUserInfo(this.name, this._age);get getAge {return _age;}set setAge(String age) {this._age = age;}
}

PrivateUserInfo在ClassDemo1.dart,ClassDemo2就无法访问了。
在这里插入图片描述
私有类也是同理,在类名前面加上下划线,这里不写案例。

4.3 类的继承

和Java同款,唯一区别是,dart语言中没有interface关键字,对于类来说,无论是extends还是implementation,他所继承的都是类。

class c1 {String? str1;void fun1() {}
}abstract class c2 {String? str2;void fun2();
}class c3 extends c2 implements c1 {String? str1; // 因为implementation,必须加上c1的成员变量void fun1() { // 因为implementation,必须加上c1的方法}void fun2() { // 因为c2的fun2是抽象方法,必须进行实现}
}

参考资料

https://blog.csdn.net/haodawang/article/details/83031378

附录

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

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

相关文章

房地产vr全景展示交互视频让购房者更有参与感

在当今房地产市场中,购房者的需求日益多样化和个性化。为满足这一趋势,我们创新性地将VR虚拟现实技术应用于楼盘宣传,为购房者带来前所未有的沉浸式购房体验。 一、地理位置全景展示 通过实景拍摄与VR技术的结合,我们为购房者呈现…

day26-单元测试

1. 单元测试Junit 1.1 什么是单元测试?(掌握) 1.2 Junit的特点?(掌握) 1.3 基本用法:(掌握) 实际开发中单元测试的使用方式(掌握) public class …

C语言,排序

前言 排序,可以说是数据结构中必不可缺的一环。我们创造数据存储它,要想知道数据之间的联系,比较是必不可少的。不然,费劲心思得来的数据若是不能有更多的意义,那么拿到了又有什么用? 排序是计算机内经常进…

风险投资公司正在帮助小投资者购买Anthropic、OpenAI等热门公司的股票

近年来,风险投资公司对于人工智能(AI)领域的公司,如Anthropic、Groq、OpenAI等,表现出了极高的投资热情。这些公司因为它们在AI技术方面的创新而备受瞩目。但是,对于很多小投资者来说,由于资金有…

[C#]使用C#部署yolov8的目标检测tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll,TensorRtExtern源码地址:TensorRT-CShar…

期权的权利金怎么算的

期权权利金的计算涉及多个因素,包括敲定价格、到期时间以及整个期权合约的具体情况。期权的权利金具体的计算公式和因素可能因不同的期权合约和市场条件而有所不同,下文为大家介绍期权的权利金怎么算的 ?本文来自:期权酱 一、期权…

【LeetCode】二叉树oj专题

如有不懂的地方,可查阅往期相关文章! 个人主页:小八哥向前冲~ 所属专栏:数据结构【c语言】 目录 单值二叉树 对称二叉树 计算二叉树的深度 二叉树的前序遍历 相同二叉树 另一棵树的子树 二叉树的构建和遍历 翻转二叉树 判…

spring boot 中的异步@Async

spring boot 开启异步调用 1、启动类上添加EnableAsync注解,表示启动异步 2、在具体实现异步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…

YOLOv3+mAP实现金鱼检测

YOLOv3mAP实现金鱼检测 Git源码地址:传送门 准备数据集 按帧数读取视频保存图片 video2frame.py使用labelimg标注工具对图片进行标注统一图片大小为 416x416,并把标签等信息写成.xml文件 conver_point.py读取缩放后的标签图片,转为左上角右下…

如何快速部署上线项目

CSDN 的小伙伴们,大家好呀,我是苍何。 今天在群里面看到有小伙伴反馈说,面试的时候一被问到简历中的项目还没上线,就不继续问了,感觉挺奇葩的,要知道就校招来说,项目本身大部分都是练手的项目&…

Linux基础1-基本指令3

上篇文章我们说到了文件,pwd,touch,mkdir等知识。 Linux基础1-基本指令2(你真的了解文件吗?)-CSDN博客 本文继续梳理其他基础命令 1.本章重点 1.删除一个空目录命令rmdir 2.删除一个文件指令rm(重要!) 3.man命令&am…

做视频号小店保证金要交多少?保证金提现条件是什么?

大家好,我是喷火龙。 做视频号小店也是需要缴纳保证金的,保证金分为类目保证金和浮动保证金。 先来说说类目保证金,类目保证金由视频号小店主体资质类型和经营商品类目决定。 类目保证金有以下三点需要注意: 1. 如果你要申请新…

CentOS 7~9 救援模式恢复root密码实战指南

在管理Linux服务器时,忘记root密码是一件棘手的事情,但幸运的是,CentOS提供了救援模式来帮助我们重置root密码。本文将详细介绍如何通过GRUB引导菜单进入紧急模式(或称为救援模式),进而恢复root用户的密码。…

Python量化交易学习——Part4:基于基本面的单因子选股策略

技术分析与基本面分析是股票价格分析最基础也是最经典的两个部分。技术分析是针对交易曲线及成交量等指标进行分析,基本面分析是基于公司的基本素质进行分析。 一般来说选股要先选行业,在选个股,之后根据技术分析选择买卖节点,因此针对行业及个股的基本面分析是选股的基础。…

# 全面解剖 消息中间件 RocketMQ-(4)

全面解剖 消息中间件 RocketMQ-(4) 一、RocketMQ 顺序消息分析 1、消息有序:指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ 可以严格的保证消息有序,可以分为分区有序或者全局有序。 2、顺序消费的原理解析 在默认的情…

vfrom二开给左边添加字段或者容器

例如,我在左侧加入一个 我的公司 字段 修改三个文件,这是文件目录 这个文件是当界面选择 简体中文 的时候,显示的 字段组件 或者 容器组件的中文名 这个文件是当界面选择 English 的时候,显示的 字段组件 或者 容器组件的英文名 把…

Spring Boot 集成 zxing 生成条形码与二维码

前面我们知道了怎么通过 使用 zxing 生成二维码以及条形码, 由于我们现在都是 web 端的项目了,那么我们看下怎么使用 Spring Boot 集成然后返回给前端展示: 工程源码 对应的工程源码我放到了这里:github源码路径,点击…

d2-crud-plus 使用小技巧(六)—— 表单下拉选择 行样式 溢出时显示异常优化

问题 vue2 elementUI d2-crud-plus,数据类型为select时,行样式显示为tag样式,但是如果选择内容过长就会出现下面这种bug,显然用户体验不够友好。 期望 代码 js export const crudOptions (vm) > {return {...columns:…

图书管理系统(https://github.com/plusmultiply0/bookmanagesystem)

特意去github找了一个用flask框架的项目,一起来学习它吧 这个系统包括很多功能:用户权限管理模块(管理员和普通用户),注册登录模块(滑块验证码功能),图书有关信息模块(借…

毫米级精度3D人脸扫描设备,助推打造元宇宙虚拟分身

在元宇宙中,虚拟分身对应的是一个三维模型,数字化的过程则是三维重建过程,通过3D人脸扫描可以通过多相机同步采集人脸部,可快速、准确地重建出真人地脸部模型及贴图,通过3D人脸扫描设备可快速重建出高逼真的虚拟分身。…