Flutter: Предупреждение: операнд операции с нулевым значением '!' имеет тип WidgetsBinding, который исключает нуль. при обновлении до флаттера 3.0.0

При обновлении до флаттера 3.0.0 возникла проблема при запуске приложения,

(Приложение работает, но в терминале есть ошибки (предупреждения)).

Это похоже на проблему с привязкой.

ошибка (предупреждение) говорит: Предупреждение: операнд операции с нулевым значением '!' имеет тип WidgetsBinding, который исключает нуль.

      : Warning: Operand of null-aware operation '!' has type 'WidgetsBinding' which excludes null.
../…/src/keyboard_visibility.dart:21
- 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../../../fvm/versions/3.0.0/packages/flutter/lib/src/widgets/binding.dart').
package:flutter/…/widgets/binding.dart:1
    WidgetsBinding.instance!.addObserver(this);

                   ^
: Warning: Operand of null-aware operation '!' has type 'WidgetsBinding' which excludes null.
../…/src/keyboard_visibility.dart:37
- 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../../../fvm/versions/3.0.0/packages/flutter/lib/src/widgets/binding.dart').
package:flutter/…/widgets/binding.dart:1
    WidgetsBinding.instance!.removeObserver(this);
                   ^
: Warning: Operand of null-aware operation '!' has type 'WidgetsBinding' which excludes null.
../…/src/bot_toast_init.dart:15
- 'WidgetsBinding' is from 'package:flutter/src/widgets/binding.dart' ('../../../fvm/versions/3.0.0/packages/flutter/lib/src/widgets/binding.dart').
package:flutter/…/widgets/binding.dart:1
    WidgetsBinding.instance!.addObserver(this);
                   ^
: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
../…/src/bot_toast_manager.dart:6
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('../../../fvm/versions/3.0.0/packages/flutter/lib/src/scheduler/binding.dart').
package:flutter/…/scheduler/binding.dart:1
  SchedulerBinding.instance!.addPostFrameCallback((_) {
                   ^
: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
../…/src/bot_toast_manager.dart:9
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('../../../fvm/versions/3.0.0/packages/flutter/lib/src/scheduler/binding.dart').
package:flutter/…/scheduler/binding.dart:1
  SchedulerBinding.instance!.ensureVisualUpdate();

Изменить: - Проблема связана с совместимостью некоторых пакетов с флаттером 3.0.0.

  • (Есть некоторые изменения во флаттере 3, так что теперь авторы пакетов должны следить за этими изменениями).

Примечания к выпуску Flutter 3.0.0

f вы видите предупреждения о привязках. При переходе на Flutter 3 вы можете увидеть предупреждения, подобные следующим:

Warning: Operand of null-aware operation '!' has type >'SchedulerBinding' which excludes null.

-например, как пакет bot_toast. В репозитории GitHub этого пакета есть открытая проблема https://github.com/MMMzq/bot_toast/issues/133 , поэтому проблема должна быть исправлена ​​вскоре после выпуска обновления, как они сказали.

3 ответа

Сначала вы должны очистить свой проект

      flutter clean
flutter pub get
flutter pub upgrade

Проверьте версию compileSdkVersion и Kotlin. Теперь это должно работать.

Мы можем просто игнорировать ошибку на данный момент. Мы рассматриваем эту ошибку как побочный эффект упрощения API. Обратитесь к примечаниям к выпуску flutter 3.0 для получения дополнительной информации об этом.

https://docs.flutter.dev/development/tools/sdk/release-notes/release-notes-3.0.0

Проблема в том, что WidgetsBinding.instanceвернуть WidgetsBinding? во флаттере версии 2.xx и в более новой версии, например v3.0.x, возвращается WidgetsBinding.

РЕШЕНИЕ

Если предупреждение исходит от вашего кода, а не от зависимостей, для поддержки флаттера версии 2.9.x и 3.0.x и удаления предупреждения вы можете сделать

        /// This allows a value of type T or T?
  /// to be treated as a value of type T?.
  T? _ambiguate<T>(T? value) => value;
  
  
  _ambiguate(WidgetsBinding.instance)!.addObserver(this);

Если предупреждение исходит от зависимостей, вы должны обновить его или иным образом подождать, пока оно не будет обновлено.

Другие вопросы по тегам