addPostFrameCallback 不能无条件调用,因为接收器在 Flutter 中可以为 'null'

时间:2021-06-22 15:54:10

标签: flutter

我遇到了麻烦但无法解决。我有这个代码

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 ('!').

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

1 个答案:

答案 0 :(得分:1)

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

在相对最近的 null-safety 迁移中,他们使 WidgetsBinding.instance 可以为空,因为它可能不会被初始化,从它类型末尾的 ? 可以明显看出。

解决方案在您的错误消息中。使用 bang 运算符 ! 或条件调用运算符 ?.。前者会告诉编译器您知道 WidgetsBinding.instance 在使用时不会是 null 并在您出错时抛出异常。如果是 null,后者什么也不做。

我建议使用前者,即 ! 运算符,因为当您在这里使用 WidgetsBinding.instance 时,预计它永远不会是 null,它可能有助于查找错误。


示例:

Bang 运算符 !

void initState() {
  super.initState();
  WidgetsBinding.instance!.addPostFrameCallback((_) => yourFunction(context));
}

有条件的调用 ?.

void initState() {
  super.initState();
  WidgetsBinding.instance?.addPostFrameCallback((_) => yourFunction(context));
}