​​​​​​​​​​​​​​

前言

一、late 关键字修饰

​​​​​​​二、赋默认值

​​​​​​​三、可选类型 (?)

​​​​​​​​​​​​​​四、三目运算符

总结



前言

之所以写这篇文章,是在定义类的一个属性homeButtons时,报错了。

Non-nullable instance field 'homeButtons' must be initialized.

Try adding an initializer expression, or a generative constructor that initializes it, or mark it 'late'.dart

根据提示解决时,用了几种方法,记录下。

Flutter版本2.0.0,dart sdk版本2.12.0开始,支持null safe。编译运行时,会对开发变量的定义和变量的使用进行代码检查,不仅对变量的数据类型进行推断确认,而且对变量是否为NULL也做确认。变量必须实例化,即非NULL安全的状态。


以下是本篇文章正文内容

一、late 关键字修饰

late 关键字修饰属性,是懒加载方式。时告诉程序该属性暂时是null,在属性使用时再实例化,请求允许编译通过。

class HomePage extends StatefulWidget {HomePage({Key? key}) : super(key: key);@override_HomePageState createState() => _HomePageState();
}class _HomePageState extends State<HomePage> with TickerProviderStateMixin {late List homeButtons;}

注意⚠️:懒加载的属性,在使用该属性前一定要完成实例化,否则,即使编译不报错,运行时会奔溃。

出现异常。

LateError (LateInitializationError: Field 'homeButtons' has not been initialized.)

​​​​​​​二、赋默认值

在定义类的一个属性homeButtons时,就赋上默认值。暂时不会报编译错误了,在使用属性之前,给该属性一个真实的数据。如果属性的值可知,亦可以默认值就是真实值。

class HomePage extends StatefulWidget {HomePage({Key? key}) : super(key: key);@override_HomePageState createState() => _HomePageState();
}class _HomePageState extends State<HomePage> with TickerProviderStateMixin {List homeButtons = ['button1','button2','button3']; // 定义属性时 赋默认值}

​​​​​​​三、可选类型 (?)

在定义类的一个属性homeButtons时,定义成可选类型 List?

class HomePage extends StatefulWidget {HomePage({Key? key}) : super(key: key);@override_HomePageState createState() => _HomePageState();
}class _HomePageState extends State<HomePage> with TickerProviderStateMixin {List? homeButtons; // 定义可选类型属性}

注意⚠️:可选类型属性使用时,因为该属性可能是null, 所以要先判空。

The method 'map' can't be unconditionally invoked because the receiver can be 'null'.
Try making the call conditional (using '?.') or adding a null check to the target ('!').

可以使用一下2中判空方式:

1、 运算符   ??

是判空运算符。顾名思义,先判断变量是否是NULL,空则选择运算符右边变量执行操作;非空则选择左边变量。

(homeFunction ??  []).map((value) {

print('点击了第$value个'),

}

2、 运算符   ??=

是判空赋值运算符。顾名思义,就是先判断变量是否是NULL,空则运算符左边的变量用右边变量赋值后,再执行操作;非空则运算符左边变量直接执行操作。

(homeFunction ??=  []).map((value) {

print('点击了第$value个'),

}

​​​​​​​​​​​​​​四、三目运算符

三目运算符的使用,与Object-C、Java等语言使用类似,不赘述了,不了解可以搜索学习相关资料。


总结

看完这篇文章后,会对Flutter支持null safe有初步了解。对象null应该编码时应注意什么,如何解决null相关的问题应该有所掌握了。

Flutter随记四:null safe之 ??= 和??和 ?使用区别相关推荐

  1. Flutter 转 null safe时报错: The argument type ‘Object‘ can‘t be assigned to the parameter type XXX

    在将Flutter工程转为 null safe的时候,遇到下面的错误: error: The argument type 'Object' can't be assigned to the param ...

  2. flutter 项目实战四 列表数据展示

    本项目借用 逛丢 网站的部分数据,仅作为 flutter 开发学习之用. 逛丢官方网址:https://guangdiu.com/ flutter windows开发环境设置 flutter 项目实战 ...

  3. 台湾积体电路制造公司(简称为台积电(TSMC))的28nm LP、HPM、HPC、HPC+四种不同处理器工艺版本的区别?

    台湾积体电路制造公司(简称为台积电(TSMC))的28nm LP.HPM.HPC.HPC+四种不同处理器工艺版本的区别? 说起处理器工艺,相信大家都多多少少知道一些,可同样的一种工艺,也会有很多不同版 ...

  4. remotepath != null 与 !TextUtils.isEmpty(remotepath) 的区别

    remotepath != null   与 !TextUtils.isEmpty(remotepath) 的区别 !TextUtils.isEmpty(remotepath)    与   remo ...

  5. Java中list==null与list.size( )==0的区别

    在此特别说明一下list!=null和list.size()>0的区别: 1.list==null,意味着list压根没有地址,在堆内就不存在. 2.list.size()=0 意思堆内有lis ...

  6. Linux网络编程(网络七层协议,TCP/IP,三次握手四次挥手,TCP/UDP的区别)

    1.OSI 7层网络模型 1.网络七层协议 (1)OSI定义了网络互连的七层框架(物理层.数据链路层.网络层.传输层.会话层.表示层.应用层),即ISO开放互连系统参考模型. (2)各层功能定义 这里 ...

  7. Flutter 学习第四天 第一个flutter项目

    这个转自我自己的有道云 想看图片去那里 文档:Day2_26 Dart 面向对象 异步语法.md 链接:http://note.youdao.com/noteshare?id=1dc3ee54f0dd ...

  8. 学习笔记-Flutter 布局(四)- Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解...

    Flutter 布局(四)- Baseline.FractionallySizedBox.IntrinsicHeight.IntrinsicWidth详解 本文主要介绍Flutter布局中的Basel ...

  9. 固定底部 布局_Google Flutter 布局(四)-Baseline IntrinsicWidth详解

    1.1 简介 Baseline这个控件,做过移动端开发的都会了解过,一般文字排版的时候,可能会用到它.它的作用很简单,根据child的baseline,来调整child的位置.例如两个字号不一样的文字 ...

  10. Flutter之第一个 Flutter App(四)

    Flutter开发文档官网英文版 初次体验Flutter:创建Flutter应用 hello 开始之前,检查一下环境: 如上图,环境正常. VS Code创建Flutter应用 1.启动 VS Cod ...

最新文章

  1. 网页制作-表单元素2
  2. FD.io/VPP — ACL
  3. linux elf 文件查看工具 readelf
  4. 马斯克脑洞破解谁是“中本聪”?
  5. linux python matplotlib 使用,关于Linux:如何在Python的matplotlib中设置“后端”?
  6. 浅析python类继承(一)
  7. 吃西瓜 最大子矩阵 三维的。 rqnoj93
  8. 威胁情报的几个关键概念
  9. CSS可见区域全局居中
  10. Script:脚本获得用户User DDL包括system、object grant
  11. 2013计算机应用基础试题及答案,《计算机应用基础》2013年9月统考模拟练习题(完整试卷版含答案)...
  12. Astute Graphics for Mac(ai创意插件合集)
  13. tornado框架学习
  14. python同时输出名字和时间_Python练习小工具——根据Exif的拍摄时间和设备名批量重命名照片...
  15. matlab手眼标定,机器人手眼标定(eye to hand和eye in hand)
  16. 论文翻译《Computer Vision for Autonomous Vehicles Problems, Datasets and State-of-the-Art》(第六章)
  17. OSChina 周三乱弹 —— 东京不热,北海道有点热
  18. 阿基米德螺旋线原理及代码
  19. python因数之和等于数字本身,完全数,盈数,亏数到底是什么鬼?python实现给你看...
  20. 小程序模板报价_小程序模板价格_小程序模板使用多少钱

热门文章

  1. Gary Rong:以太坊的轻节点协议
  2. 【android开发】手机应用管理器的实现之获取应用列表(一)
  3. 个人空间岁末大回报活动12月25日获奖名单
  4. 如何制作简单的日历html5,js+html制作简单日历的方法
  5. 前端--开发“抽屉新热榜”
  6. Google Play支付:测试报错“无法购买您要的商品”问题
  7. pyinstaller包含html文件,pyinstaller打包exe
  8. Android封装含有通用标题栏的基类BaseActivity
  9. python分割出两幅图像重叠区域代码
  10. MySQL数据库与身份认证(鉴权)学习、复习笔记