flutter - addPostFrameCallback 不能无条件调用,因为 Flutter 中的接收者可以为“null”
问题描述
我遇到了麻烦,但无法解决。我有这个代码
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) => yourFunction(context));
}
我得到了
The method 'addPostFrameCallback' 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 ('!').
为什么以及如何解决这个问题?
解决方案
WidgetsBinding.instance
并不总是初始化。runApp
将为您执行此操作,因此您只需要担心如果您在 之外执行某些操作,则它不会被初始化runApp
,而您在这里没有执行此操作。
在相对较新的向null-safety的迁移中,他们使WidgetsBinding.instance
nullable 为 null,因为它可能不会被初始化,从?
它的类型末尾可以明显看出。
解决方案在您的错误消息中。使用 bang 运算符!
或条件调用运算符?.
。前者会告诉编译器你知道它在使用时WidgetsBinding.instance
不会出现null
,如果你错了就会抛出异常。如果是 ,后者将什么也不做null
。
我建议使用前者,即!
运算符,因为预计在您在这里使用它时WidgetsBinding.instance
永远不会null
使用它,它可能有助于发现错误。
例子:
爆炸算子!
:
void initState() {
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((_) => yourFunction(context));
}
有条件的调用?.
:
void initState() {
super.initState();
WidgetsBinding.instance?.addPostFrameCallback((_) => yourFunction(context));
}
推荐阅读
- gulp - 如何使用 gulp 将版本添加到文件中?
- java - 使用 Jackson 将 XML 属性添加到手动构建的节点树
- javascript - 切换滚动条可见性在 Safari 上不起作用(在 Chrome 上工作)
- wordpress - 更改 wordpress URL - 域和服务器位于不同的提供商中
- php - PHP 无法识别来自 Android HttpsURLConnection 的 POST
- c - 静态变量未初始化为零
- php - 准备好的语句没有错误并且不起作用
- c# - 视图中的 ASP.NET Core 端点路由链接生成
- vagrant - Vagrant 无法运行触发器:未知配置部分“触发器”
- python - 有没有办法散布/交叉两个较大二维数组的块并获得两者之间的梯度/斜率?