理解“!”飞镖中的爆炸运算符
我在 Stateful 类中声明了一个回调方法,例如:
final void Function(int index)? onSelected;
MyBottomNavigationBar({@required this.onSelected});
并在 state 类中使用widget.onselected调用,例如:
widget.onSelected!(_selectedIndex);
但我无法理解! 砰运算符。我不能在没有给出的情况下在构造函数中初始化 widget.onSelected ?申报期间。
我的主要问题是“如何! bang 运算符处理空值?它有什么用?
回答
该Bang运营商做无非告诉Dart,即使我们已经定义了一些变量作为一个Nullable类型,它definitely不能为null。
Dart'sNullable safety和Flow Analysis在这里通过避免运行时错误并在编译时捕获它们来使开发人员的生活变得轻松。
当你定义时,
final void Function(int index)? onSelected;
我们告诉 dart 这个变量may or may not被分配了一个值,因此它可能是也可能不是null。
现在,每当你尝试像这样使用它时,
widget.onSelected()
Dart 会警告你,这是一个Nullable类型变量,因此要格外小心。
如果 Dart 没有事先告诉您这一点,那么您会在运行该应用程序后意识到这一点,并且在尝试调用该函数时它会崩溃。
现在,既然 dart 已经警告过你不能那样使用它,那么有两种方法来处理它。
-
在使用之前进行空检查。这样我们就可以避免运行时错误。
var onSelected = widget.onSelected; if (onSelected != null) onSelected(_selectedIndex);创建新的局部变量是必要的,因为 Dart 的流分析仅适用于局部变量空检查,而不适用于类级别变量空检查。
-
使用
bang运算符,widget.onSelected!(_selectedIndex)现在的问题是,您只是向 Dart 保证它永远不会为空,但如果它实际上为空,它仍然会导致运行时崩溃。
因此,当您必须访问可为空类型的变量时,Bang运算符只是一种绕过 dart 的方法flow analysis。
希望这至少可以消除您的一些疑问。