首页 > 解决方案 > 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 ('!').

为什么以及如何解决这个问题?

标签: flutter

解决方案


WidgetsBinding.instance并不总是初始化。runApp将为您执行此操作,因此您只需要担心如果您在 之外执行某些操作,则它不会被初始化runApp,而您在这里没有执行此操作。

在相对较新的向null-safety的迁移中,他们使WidgetsBinding.instancenullable 为 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));
}

推荐阅读