当前位置: 首页 > news >正文

flutter学习-day3-dart基础

📚 目录

  1. 变量声明
  2. 操作符
  3. 数据类型
  4. 控制流
  5. 错误处理和捕获
  6. 函数
  7. mixin
  8. 异步
    1. Future
    2. Stream

本文学习和引用自《Flutter实战·第二版》:作者:杜文

1. 变量声明

  • var

类似于 JavaScript 中的var,它可以接收任何类型的变量,但最大的不同是 Dart 中 var 变量一旦赋值,类型便会确定,则不能再改变其类型:

var name = "李四"
/// 对
name = "张三"
/// 错
name = 1000
  • Object

Object 是 Dart 所有对象的根基类,也就是说在 Dart 中所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象,且后期可以改变赋值的类型。但是声明的对象只能使用 Object 的属性与方法, 否则编译器会报错。

Object t = 1000t = "张三"print(t.length) // 错
  • dynamic

任何类型的数据都可以赋值给dynamic声明的对象,且声明的变量都可以赋值任意对象,且后期可以改变赋值的类型。而编译器会提供所有可能的组合给声明的对象,这个特点使得我们在使用它时需要格外注意,比如下面代码在编译时不会报错,而在运行时会报错:

dynamic tt = "王五"print(t.xxx) // 错
  • final

如果您从未打算更改一个变量,那么可以使用 final。一个 final 变量只能被设置一次。它是一个运行时常量,final变量在运行时才知道其值,用于防止变量在程序运行期间被改变。

  • const

如果您从未打算更改一个变量,那么可以使用 const。与final的区别是,const 变量是一个编译时常量,其值必须在声明时就确定。(编译时直接替换为常量值)用于创建编译时常量,以便进行性能优化。

  • 空安全

Dart 中一切都是对象,这意味着如果我们定义一个数字,在初始化它之前如果我们使用了它,假如没有某种检查机制,则不会报错。如下:

test() {int i; print(i*8); // 错
}

在 Dart 引入空安全之后,如果一个变量没有初始化,则不能使用它,否则编译器会报错:

int a = 10

声明时候可以加上?,指定变量是可空:

String? name;

如果我们预期变量不能为空,但在定义时不能确定其初始值,则可以加上late关键字,表示会稍后初始化,但是在正式使用它之前必须得保证初始化过了,否则会报错:

late int c;c = 100

如果一个变量我们定义为可空类型,且判空了,但是预处理器仍然有可能识别不出,这时我们就要在变量后面加一个!符号,告诉预处理器它已经不是null了。

class Test() {int? d;log() {if (d! = null) {print(d! * 100)}}
}

如果函数变量可空时,调用的时候可以用语法糖:

fun?.call()
  • 特殊声明模式
// 同时声明
var (a, [b, c]) = ('str', [1, 2])// 同时声明
var (c, d) = ('left', 'right');// 交换2个值
(c, d)  = (d, c)// 解构
var (name, age) = userInfo(json)// 省略符 
var (a, b, ...rest) = [1, 2, 3, 4, 5, 6] // 1 2 [3,4,5,6]var (a, b, ...rest, c, d) = [1, 2, 3, 4, 5, 6] // 1 2 [3,4] 5 6var (a, b, ..., c, d) = [1, 2, 3, 4, 5, 6] // 1 2 5 6

2. 操作符

  • 算数运算符
符号意义描述
+-
--
*-
/-
~/返回整数结果
%取余获取整数除法的余数
  • 等于运算符
符号意义描述
==平等-
!=不相等-
>大于-
<小于-
>=大于或等于-
<=小于或等于-
  • 逻辑运算符
符号意义描述
!反转-
||或者-
&&并且-
  • 赋值运算符
符号意义描述
=赋值-
*=乘法赋值-
+=加法赋值-
-=减法赋值-
/=除法赋值-
%=取模赋值-
~/=返回除法整数结果赋值-
=按位或赋值
&=按位与赋值-
^=按位异或赋值-
<<=左移赋值-
>>=右移赋值(保留符号位)-
>>>=右移赋值(无符号右移)-
  • 类型运算符
符号意义描述
as类型转换断言-
is如果对象具有指定的类型,则为 True-
is!如果对象没有指定的类型,则为 True-
// 如果您不确定该对象的类型是否为Person,则在使用对象之前用is检查
if (employee is Person) {employee.firstName = 'Bob';
}
  • 按位运算符
符号意义描述
&-
|-
^异或-
<<左移-
>>右移-
>>>无符号右移-
  • 条件表达式
语法意义描述
condition ? expr1 : expr2赋值三元表达式
expr1 ?? expr2赋值如果 expr1 为非 null,则返回其值; 否则,计算并返回 expr2 的值
?.xxx短路条件成员访问
!断言将表达式强制转换为其基础不可为 null 的类型
  • 级联表示法

级联允许您在同一对象上,进行一系列操作。

// 级联语法
var paint = Paint()..color = Colors.black..strokeCap = StrokeCap.round..strokeWidth = 5.0;// 等价于如下语法
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;
// 级联语法
querySelector('#confirm')?..text = 'Confirm'..classes.add('important')..onClick.listen((e) => window.alert('Confirmed!'))..scrollIntoView();// 等价于如下语法
var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();

3. 数据类型

关键字描述
int不大于 64 位的整数值
double64 位(双精度)浮点数
String字符串,多行字符串可以用’‘‘xxx’’’
bool字符串
Set
Map地图
List列表
Symbol符号
Nullnull
record记录
typedef类型别名

4. 控制流

  • switch
int size = 2;// 条件判断
switch (size) {case 1:print('一');case [2, 3]:print('二 and 三')case [4 || 5]:print('四 or 五')case >= 6 && <= 10print('六 to 十')
}// 条件赋值
var bg = Color.greenvar isPrimary = switch (bg) {Color.red || Color.yellow || Color.blue => true,_ => false
}
  • for
var message = StringBuffer('Dart is fun');for (var i = 0; i < 5; i++) {message.write('!');
}
  • fon-in
Map<String, int> listMap = {'a': 23,'b': 100,
};for (final MapEntry(key: key, value: value) in listMap.entries) {print('键:$key 值:$value');
}
  • while
while (!isDone()) {doSomething();
}
  • do-while
do {printLine();
} while (!atEndOfPage());
  • 跳过和停止
while (true) {if (shutDownRequested()) break;processIncomingRequests();
}for (int i = 0; i < candidates.length; i++) {var candidate = candidates[i];if (candidate.yearsExperience < 5) {continue;}candidate.interview();
}
  • if
if (isRaining()) {you.bringRainCoat();
} else if (isSnowing()) {you.wearJacket();
} else {car.putTopDown();
}
  • if-case
// 接受一个名为pair的参数。如果pair的类型是[int x, int y],则返回一个Point(x, y)对象
if (pair case [int x, int y]) return Point(x, y);

5. 错误处理和捕获

异常捕获和JavaScript差不多

try {breedMoreLlamas();
} on OutOfLlamasException {// 特定的异常buyMoreLlamas();
} on Exception catch (e) {// 任何其他的例外print('Unknown exception: $e');
} catch (e) {// 没有指定类型,处理所有类型print('Something really unknown: $e');
} finally {cleanLlamaStalls();
}
  • 若要部分处理异常, 同时允许它传播, 使用关键字:rethrow
void misbehave() {try {dynamic foo = true;print(foo++); // 运行时错误} catch (e) {print('misbehave() partially handled ${e.runtimeType}.');rethrow; // 允许调用者看到异常}
}void main() {try {misbehave();} catch (e) {print('main() finished handling ${e.runtimeType}.');}
}
  • 断言

在开发过程中,使用断言语句,如果布尔条件为false,则触发。如果条件为true,则不触发。在生产代码中,断言将被忽略。

// assert(条件, 可选消息)
var sizi = 101;
assert(size < 100, "Error:size 小于 100!");

6. 函数

Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。

  • 函数声明
bool isNoble(int ) {return atomicNumber > 40;
}bool isNoble (int atomicNumber) => atomicNumber > 40;
  • 函数作为参数传递
//定义函数execute,它的参数类型为函数
void execute(var callback) {// 执行传入的函数callback();
}// 调用execute,将箭头函数作为参数传递
execute(() => print("xxx"))
  • 可选的位置参数
String say(String a, String b, [String? c]) {var result = '$a and $b';if (c != null) {result = '$result and $c';}return result;
}
  • 可选的命名参数
//设置[a]和[b]标志
void enableFlags({bool a, bool b}) {// ... 
}// 调用函数时,可以使用指定命名参数
enableFlags(bold: true, hidden: false)

7. mixin

Dart 是不支持多继承的,但是它支持 mixin。可以定义几个 mixin,然后通过 with 关键字将它们组合成不同的类(同名会被最后的覆盖)。如下例子:

class Person {say() {print('say');}
}mixin Eat {eat() {print('eat');}
}mixin Walk {walk() {print('walk');}
}mixin Code {code() {print('key');}
}class Dog with Eat, Walk{}
class Man extends Person with Eat, Walk, Code{}

8. 异步

Dart类库有非常多的返回Future或者Stream对象的函数,这些函数被称为异步函数。

8-1. Future

Future与JavaScript中的Promise非常相似。

// 使用Future.delayed 创建了一个延时任务,2秒后返回结果字符串,然后在then中接收异步结果并打印
Future.delayed(Duration(seconds: 2),(){return "hi world!";
}).then((data){// 执行成功print(data);
}).catchError((e){//执行失败会走到这里  print(e);
}).whenComplete((){//无论成功或失败都会走到这里
});
  • 多个异步:Future.wait
Future.wait([// 2秒后返回结果  Future.delayed(Duration(seconds: 2), () {return "hello";}),// 4秒后返回结果  Future.delayed(Duration(seconds: 4), () {return " world";})
]).then((results){print(results[0]+results[1]);
}).catchError((e){print(e);
});
  • 解决回调地狱:async/await
task() async {try{String id = await login("alice","******");String userInfo = await getUserInfo(id);await saveUserInfo(userInfo);// 执行接下来的操作} catch(e){// 错误处理print(e);}
}

8-2. Stream

Stream 也是用于接收异步事件数据,和 Future 不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。

Stream.fromFutures([// 1秒后返回结果Future.delayed(Duration(seconds: 1), () {return "hello 1";}),// 抛出一个异常Future.delayed(Duration(seconds: 2),(){throw AssertionError("Error");}),// 3秒后返回结果Future.delayed(Duration(seconds: 3), () {return "hello 3";})
]).listen((data){print(data);
}, onError: (e){print(e.message);
},onDone: (){});// 上述代码依次输出
// hello 1
// Error
// hello 3

本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

  • Vue2全家桶+Element搭建的PC端在线音乐网站
  • vue3+element-plus配置cdn
  • 助你上手Vue3全家桶之Vue3教程
  • 助你上手Vue3全家桶之VueX4教程
  • 助你上手Vue3全家桶之Vue-Router4教程
  • 超详细!Vue的九种通信方式
  • 超详细!Vuex手把手教程
  • 使用nvm管理node.js版本以及更换npm淘宝镜像源
  • vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令
  • 超详细!Vue-Router手把手教程

个人主页

  • CSDN
  • GitHub
  • 简书
  • 博客园
  • 掘金

相关文章:

flutter学习-day3-dart基础

&#x1f4da; 目录 变量声明操作符数据类型控制流错误处理和捕获函数mixin异步 FutureStream 本文学习和引用自《Flutter实战第二版》&#xff1a;作者&#xff1a;杜文 1. 变量声明 var 类似于 JavaScript 中的var&#xff0c;它可以接收任何类型的变量&#xff0c;但最大…...

gitblit自建git仓库

在Ubuntu服务器 安装 java sudo apt-get update sudo apt-get install openjdk-8-jdk # 或者其它你喜欢的版本//sudo snap install gitblit 验证&#xff1a; java -version下载 gitblit https://github.com/gitblit-org/gitblit/releases解压/usr/local tar -zxvf gitb…...

二百一十一、Flume——Flume实时采集Linux中的Hive日志写入到HDFS中(亲测、附截图)

一、目的 为了实现用Flume实时采集Hive的操作日志到HDFS中&#xff0c;于是进行了一场实验 二、前期准备 &#xff08;一&#xff09;安装好Hadoop、Hive、Flume等工具 &#xff08;二&#xff09;查看Hive的日志在Linux系统中的文件路径 [roothurys23 conf]# find / -name…...

python 实现 AIGC 大模型中的概率论:生日问题的基本推导

在上一节中&#xff0c;我们对生日问题进行了严谨的阐述&#xff1a;假设屋子里面每个人的生日相互独立&#xff0c;而且等可能的出现在一年 365 天中的任何一天&#xff0c;试问我们需要多少人才能让某两个人的生日在同一天的概率超过 50%。 处理抽象逻辑问题的一个入手点就是…...

YOLOv8算法改进【NO.87】引入上下文引导网络(CGNet)的Light-weight Context Guided改进C2_f

前 言 YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通: 第一,创新主干特征提取网络,将整个Backbone改…...

GPT-4V 在机器人领域的应用

在科技的浩渺宇宙中&#xff0c;OpenAI如一颗璀璨的星辰&#xff0c;于2023年9月25日&#xff0c;以一种全新的方式&#xff0c;向世界揭示了其最新的人工智能力作——GPT-4V模型。这次升级&#xff0c;为其旗下的聊天机器人ChatGPT装配了语音和图像的新功能&#xff0c;使得用…...

Java基础语法之访问修饰限定符

private 表示私有的&#xff0c;只能在同一个包中的同一个类使用 像这样就是在同一个包中的不同类用了private修饰的变量&#xff0c;这是非法的&#xff0c;那到底该如何给a赋值呢&#xff1f;可以在定义时就赋值&#xff0c;但这样的代码就没有可操作性&#xff0c;所以我们…...

算法通关村第十八关 | 青铜 | 回溯

1.回溯 回溯可以视为递归的拓展&#xff0c;有着明确的解题模板。 很大的不同之处是有一个撤销处理结果的操作&#xff0c;但是大框架就是遍历 N 叉树。 回溯主要解决暴力枚举都解决不了的问题。 回溯模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;…...

蓝牙在物联网中的应用,相比WIFI和NFC的优势?

蓝牙在物联网中有着广泛的应用&#xff0c;主要包括以下几个方面&#xff1a; 1、智能家居&#xff1a;蓝牙Mesh技术可以用于智能家居设备之间的连接和通信&#xff0c;实现设备的远程控制和管理。例如&#xff0c;通过蓝牙技术可以将智能音箱、智能电视、智能家电等设备连接起…...

Altair推出 Altair RapidMiner 2023 平台,提供生成式 AI 功能

Altair推出 Altair RapidMiner 2023 平台&#xff0c;提供生成式 AI 功能 更新包括自动聚类、扩展 SAS、Python 和 R 编程功能等 近日&#xff0c;Altair&#xff08;纳斯达克股票代码&#xff1a;ALTR&#xff09;近日宣布其数据分析和 AI 平台 Altair RapidMiner 取得了一系…...

包管理工具npm与yarn

1.npm 1.1 安装 安装node后自带了npm 2.2 初始化package.json npm init 1.3 安装包 单个包&#xff1a;npm install less或npm i less 所有包&#xff1a;npm installnpm i 1.4 删除包 npm remove less&#xff0c;npm r less或npm uninstall less 1.5 配置别名 pack…...

深度学习 Day11——T11优化器对比实验

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…...

(十六)Flask之蓝图

蓝图 Flask蓝图&#xff08;Blueprint&#xff09;是Flask框架中用于组织和管理路由、视图函数以及静态文件的一种机制。它提供了一种将应用程序拆分为更小、可重用组件的方式&#xff0c;使得项目结构更清晰&#xff0c;代码更易于维护。 使用Flask蓝图&#xff0c;可以将相…...

面试问题--文件IO

文件 I/O 操作在 C 语言中的使用 在 C 语言中&#xff0c;文件 I/O&#xff08;Input/Output&#xff09;操作是处理文件的重要部分。本文将介绍一些常见的文件 I/O 操作及其使用示例。 打开和关闭文件 1.打开文件&#xff1a; fopen() 函数用于打开一个文件。 FILE *fpt…...

SpringBoot中实现跨域的几种常用方式

在SpringBoot中实现跨域请求可以通过以下几种方式&#xff1a; 1. 使用CrossOrigin注解&#xff0c;可以直接在Controller层的方法上使用&#xff0c;用来指定允许跨域请求的来源、方法和头信息。例如&#xff1a; CrossOrigin(origins "http://localhost:8080") …...

MeterSphere实战(一)

MeterSphere是一位朋友讲到的测试平台&#xff0c;说这东西是开源的&#xff0c;因为我是做测试的&#xff0c;很乐意了解一些新鲜事物。在我看来&#xff0c;测试就是要专注一些领域&#xff0c;然后要啥都会一点点&#xff0c;接着融会贯通起来&#xff0c;这样就可以万变不离…...

ESP32-Web-Server编程-在网页中插入图片

ESP32-Web-Server编程-在网页中插入图片 概述 图胜与言,在网页端显示含义清晰的图片,可以使得内容更容易理解。 需求及功能解析 本节演示在 ESP32 Web 服务器上插入若干图片。在插入图片时还可以对图片设置一个超链接,用户点击该图片时,网页将跳转到图片对应的链接网址…...

<软考>软件设计师-4知识产权与标准化(总结)

(一)知识产权概述 1 知识产权 是指公民、法人、非法人单位对自己的创造性智力成果和其他科技成果依法享有的民事权。是智力成果的创造人依法享有的权利和在生产经营活动中标记所有人依法所享有的权利的总称。包含著作权、专利权、商标权、商业秘密权、植物新品种权、集成电路布…...

唯创知音WTVxxx语音芯片在免洗烘干机中的应用:提升用户体验与产品智能化

在现今这个高科技普及的时代&#xff0c;人们对家电产品的需求不再仅仅满足于基本功能&#xff0c;而是更多的关注用户体验和产品智能化。因此&#xff0c;唯创知音WTVxxx语音芯片在免洗烘干机中的应用&#xff0c;无疑是对这一需求的完美回应。 唯创知音WTVxxx语音芯片是一款…...

golang游戏服务器 - tgf系列课程06

游戏配置 使用框架提供的游戏配置工具,只要两步,开箱即用需求描述 沿用上一节课的案例, 创建道具表,通过道具id在道具服中获取配置中道具的名称Excel 创建配置表根据项目文档中进阶教程目录下ExcelToJson的教程文档,创建指定格式的Excel文件. 脚本 生成脚本 func main() {//…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...