Fluter学习3 - Dart 空安全

Dart 空安全:

  • 空类型操作符 (?)
  • 空值合并操作符 (??)
  • 空值断言操作符 (!)
  • 延迟初始化 (late)

1、空类型操作符 (?)

  • 当你想要根据一个表达式是否为 null 来执行某个操作时,你可以使用 (?)
  • 语法:expression1?.expression2
  • 如果 expression1 不是 null,则执行 expression2 并返回其结果。如果 expression1 是 null,则直接返回 null,并且不会执行 expression2。
String? name;int? length = name?.length;
// 如果 name 是 null,length 也会是 null  
// 如果 name 不是 null,length 将会是 name 的长度

2、空值合并操作符 (??)

  • 当你想要为一个可能为 null 的表达式提供一个默认值时,你可以使用 (??)
  • 语法:expression1 ?? expression2
  • 如果 expression1 不是 null,则返回 expression1 的值。如果 expression1 是 null,则返回 expression2 的值。
String? name = getName();  
String fullName = name ?? "Unknown";
// 如果 name 是 null,则 fullName 为 "Unknown"
// 如果 name 不是 null,则 fullName 为 name 的值

3、空值断言操作符 (!)

  • 当你确定一个表达式不应该为 null,但编译器无法确定时,你可以使用!来告诉编译器你确信该表达式不是 null
  • 语法:expression!
  • 使用此操作符时,你应确保表达式确实不是 null,否则在运行时会出现 NullPointerException
String? name = getName();  
int length = name!.length;
// 确信 name 不是 null,并获取其长度
// 如果 name 是 null,则会报错 NullPointerException
补充,(!) 取反用法
void main(){String name = "leon";if(name is! String){print("其他类型");}else{print("String类型");}
}
//输出:String类型

4、延迟初始化 (late)

  • 当你在声明变量时使用 late 关键字,你告诉 Dart 编译器该变量将在稍后的某个时间点被初始化,而不是在声明时立即初始化
void main() {  late String name; // 声明一个late变量,此时不需要初始化  if (someCondition) {  name = 'Alice'; // 在某个条件满足时进行初始化  } else {  name = 'Bob'; // 在另一个条件满足时进行初始化  }  print(name); // 使用已经初始化的变量  
}  bool someCondition = true; // 假设这是某个条件,实际情况中可能根据逻辑判断来设置
  • 在 Flutter 中 State 的 initState 方法中初始化的一些变量,是比较适合使用 late 来进行延时初始化的
  • 因为在 Widget 生命周期中 initState 方法是最先执行的,所以它里面初始化的变量通过 late 修饰后既能保障使用时的便利,又能防止空异常
class _TravelPgeState extends State<TravelPge> with TickerProviderStateMixin {late TabController _controller;void initState() {super.initState();_controller = TabController(length: 0, vsync: this);}...

5、补充:Widget 生命周期

  • 在 Flutter 中,Widget 并不直接具有生命周期,因为 Widget 是不可变的(immutable)
  • 然而,Flutter 中的 StatefulWidget 和 State 对象确实具有生命周期,因为 StatefulWidget 可以创建和管理一个可变的状态对象(State)

当你插入一个 StatefulWidget 到 Flutter 的 widget 树时,Flutter 会进行以下操作:

创建(Create):
  • StatefulWidget 的实例被创建
  • createState() 方法被调用以创建一个新的 State 对象
  • initState() 方法在 State 对象上被调用,你可以在这里进行初始化操作
插入(Insert):
  • StatefulWidget 和它的 State 对象被插入到 widget 树中
  • build() 方法在 State 对象上被调用,以构建 widget 树
更新(Update):
  • 当 StatefulWidget 的依赖项发生变化时,Flutter 会重新构建 widget 树
  • build() 方法会再次被调用,但 State 对象不会改变
  • 如果你想根据新的依赖项更新 State,你可以调用 setState(() {}),这将导致 build() 方法再次被调用,但 initState() 不会被调用
移除(Remove):
  • 当 StatefulWidget 从 widget 树中移除时,Flutter 会调用 dispose() 方法。你可以在这里释放任何资源或执行任何必要的清理操作

注意,build() 方法在整个生命周期中可能会被多次调用,而 initState() 和 dispose() 方法每个 State 对象只会被调用一次。

class LifecycleWidget extends StatefulWidget {    _LifecycleWidgetState createState() => _LifecycleWidgetState();  
}  class _LifecycleWidgetState extends State<LifecycleWidget> {    void initState() {  super.initState();  print('initState called');  // 初始化代码  }    Widget build(BuildContext context) {  print('build called');  return Container(  padding: const EdgeInsets.all(16.0),  child: Text('Lifecycle Widget'),  );  }    void dispose() {  super.dispose();  print('dispose called');  // 清理代码  }  
}
  • 在这个例子中,当你插入 LifecycleWidget 到 Flutter 应用中时,你会看到 “initState called” 和 “build called” 打印出来
  • 如果依赖项发生变化并触发重建,只有 “build called” 会再次打印
  • 当你从 widget 树中移除 LifecycleWidget 时,“dispose called” 会打印出来。

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

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

相关文章

Python开发户型图编辑器-2D/3D户型图展示

在现代家居设计中&#xff0c;户型图是不可或缺的工具&#xff0c;它为设计师和业主提供了一个直观的展示和规划空间的方式。然而&#xff0c;传统的户型图编辑软件往往复杂难用&#xff0c;限制了设计师的创作灵感。我们为您带来了一款全新的Python开发的户型图编辑器&#xf…

字节飞书面试算法题

后端]计算没有重复字符的子字符串数量 题目描述 给定你一个只包含小写英文字母的字符串 s 。如果一个子字符串不包含任何字符至少出现两次&#xff08;换句话说&#xff0c;它不包含重复字符&#xff09;&#xff0c;则称其为 特殊 子字符串。你的任务是计算 特殊 子字符串的数…

计算机视觉基础:【矩阵】矩阵选取子集

OpenCV的基础是处理图像&#xff0c;而图像的基础是矩阵。 因此&#xff0c;如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作&#xff0c;从而更好地实现对图像的处理。 示例 示例&#xff1a;选取矩阵中指定的行和列的…

Positive Technologies 确保 Rostic‘s 网络应用程序的安全

☑️ PT BlackBox分析 Rostics 网络应用程序的安全性 快餐连锁店在其安全网络开发过程中使用了我们的扫描仪。PT BlackBox 总共扫描了 20 多个 Rostics 的外部服务&#xff08;每天访问量超过 100,000 人次&#xff09;和企业服务&#xff08;每天访问量≈7,000 名员工&#x…

区块链游戏解说:什么是 Nine Chronicles

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a; Nine Chronicles Dashboard 什么是 Nine Chronicles Nine Chronicles 是一款去中心化的在线角色扮演游戏&#xff0c;标志着在线游戏和区块链技术的发展。 Nine Chroni…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

基于springboot+vue医院电子病历管理系统

一、系统架构 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、 代码及数据库 三、功能介绍 01. 登录页 02. 用户管理-管理员 03. 用户管理-患者 04. 用户管理-医生 05. 用户管理…

如何实现上拉加载,下拉刷新?

文章目录 一、前言二、实现原理上拉加载下拉刷新 三、案例小结 参考文献 一、前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中 本质上等同于PC网页中的分页&#xff0c;只是交互形式不同 开源社区也有很多优秀的解决方案&#xff0c;如iscroll、better-scroll、pu…

2023年06月CCF-GESP编程能力等级认证C++编程三级真题解析

一、单选题(每题 2 分,共 30 分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A. 编辑 B. 保存 C. 调试 D. 编译 答案:D 第2题 二进制数 11.01 在十进制下是( )。 A. 3.01 B. 3.05 C. 3.125 D. 3.25 答案:D 第3题 已…

APK签名生成工具​

APK签名生成工具​ 点击下载安装签名生成工具&#xff0c;将你的应用的线上包安装到手机上&#xff0c;输入应用正确包名即可获取到签名信息。​ 注意&#xff1a;debug 包和线上包生成的签名是不一样的&#xff0c;所以这个地方要用线上包生成。​ 目前也支持使用keytool命…

每日一题——LeetCode1470.重新排列数组

方法一 把数组的前n项看做一个数组&#xff0c;后n项看做一个数组&#xff0c;两个数组循环先后往res里push元素 var shuffle function(nums, n) {let res[]for(let i0;i<n;i){res.push(nums[i])res.push(nums[in])}return res }; 消耗时间和内存情况&#xff1a; 方法二…

【sgCreateTableData】自定义小工具:敏捷开发→自动化生成表格数据数组[基于el-table]

源码 <template><!-- 前往https://blog.csdn.net/qq_37860634/article/details/136141769 查看使用说明 --><div :class"$options.name"><div class"sg-head">表格数据生成工具</div><div class"sg-container&quo…

multipath多路径显示异常

一、现象 使用multipath -ll显示一个磁盘多大3条路径都是active faulty running状态&#xff0c;而正常状态的链路应该是&#xff1a;active ready running&#xff0c;具体如下图&#xff1a; 二、分析 1、通过各种检查均未发现异常&#xff0c;检查内容包括&#xff1a;操作…

刷LeetCode541引起的java数组和字符串的转换问题

起因是今天在刷下面这个力扣题时的一个报错 541. 反转字符串 II - 力扣&#xff08;LeetCode&#xff09; 这个题目本身是比较简单的&#xff0c;所以就不讲具体思路了。问题出在最后方法的返回值处&#xff0c;要将字符数组转化为字符串&#xff0c;第一次写的时候也没思考直…

【Spring Boot 使用Filter统一处理请求数据转换】

Spring Boot 使用Filter统一处理请求数据转换 背景知识Spring Boot Filter 使用场景 请求预处理技术实现1. 创建自定义Filter类2. 创建自定义请求包装器3. 注册Filter 背景知识 Spring Boot Filter 使用场景 身份验证和授权 场景描述: 在用户访问应用程序的敏感资源之前&…

【经验分享】自然语言处理技术有哪些局限性和挑战?

个人认为&#xff0c;主要是两个难点&#xff1a; 1.语料&#xff0c;通常的语料很好解决&#xff0c;用爬虫从互联网上就可以采集和标注训练。但是我们接触很多项目和客户需求都是专业性很强的&#xff0c;例如&#xff1a;航天材料、电气设备、地理信息、化学试剂 等等。往往…

Python面向对象:组合

组合与重用性 组合指的是&#xff0c;在一个类中以另外一个类的对象作为数据属性&#xff0c;称为类的组合 class Equip: # 武器装备类 def fire(self): print(release Fire skill) class Riven: # 英雄Riven的类&#xff0c;一个英雄需要有装备&#xff0c;因而需要组合E…

【微服务生态】Docker

文章目录 一、基础篇1. 简介2. 下载与安装3. 常用命令3.1 帮助启动类3.2 镜像命令3.3 容器命令 4. Docker 容器数据券5. Docker 镜像5.1 commit 生成镜像5.2 Docker Registry5.3 发布镜像 6. Docker 常规安装软件 二、高级篇1. Dockerfile1.1 概述1.2 基础知识1.3 Dockerfile常…

使用单元测试框架Junit的正确姿势

大家好&#xff0c;我是G探险者。 不知道大家平时开发出来的功能&#xff0c;写不写单元测试&#xff1f;反正我是不咋写&#xff0c;写个单元测试有时候mock比开发实际功能都难搞&#xff0c;谁写谁懂得。 没办法&#xff0c;由于甲方爸爸的要求&#xff0c;我们必须得写单元…

如何系统地自学Python?

如何系统地自学Python&#xff1f; 如何系统地自学Python&#xff1f;1.了解编程基础2.学习Python基础语法3.学习Python库和框架4.练习编写代码5.参与开源项目6.加入Python社区7.利用资源学习8.制定学习计划9.持之以恒总结 如何系统地自学Python&#xff1f; 作为一个Python语…