addPostFrameCallback не может быть вызван безоговорочно, потому что получатель может быть «нулевым» в Flutter

#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:

WidgetsBinding.instance не всегда инициализируется. runApp сделает это за вас , так что вам придется беспокоиться только о том, что он не будет инициализирован, если вы делаете что-то за пределами runApp , чего вы здесь не делаете.

В относительно недавнем переходе на нулевую безопасность они сделали WidgetsBinding.instance nullable, поскольку возможно, что он не будет инициализирован, что видно из ? его типа в конце.

Решение содержится в вашем сообщении об ошибке. Используйте либо оператор 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));
}