#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));
}