Kotlin (MainActivity.kt) — разрешены только безопасные (?.) или ненулевые (!!.) вызовы с нулевым приемником типа FlutterEngine?

e: C:\flutter\POC\contacts\android\app\src\main\kotlin\com\example\contacts\MainActivity.kt: (98, 58): Только безопасные (?.) или ненулевые утверждения (! !.) разрешены вызовы для получателя, допускающего значение NULL, типа FlutterEngine?

ОШИБКА: сборка не удалась с исключением.

  • Что пошло не так: Не удалось выполнить задачу ':app:compileDebugKotlin'.

Ошибка при выполнении org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction Ошибка компиляции. Смотрите журнал для более подробной информации

  • Пытаться:

Запустите с параметром --stacktrace, чтобы получить трассировку стека. Запустите с параметром --info или --debug, чтобы получить больше выходных данных журнала. Запустите с параметром --scan, чтобы получить полную информацию.

ПОСТРОЙКА НЕ ПРОШЛА через 11 секунд Исключение: задача Gradle assembleDebug не удалась с кодом выхода 1


  • Я пытаюсь получить контакты пользователя, используя каналы платформы (а не плагины), интегрированные с флаттером.
  • Я добавил источники каналов платформы в MainActivity.kt.
  • я добавил разрешение в AndroidManifest.xml.
  • Я добавил часть пользовательского интерфейса в contact.dart.
  • Прикрепил исходники, пробовал.

Я хочу получить доступ к контактам пользователя, используя каналы платформы. Это мой файл кода пользовательского интерфейса. Это мой файл MainActivity.kt.

2
0
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто измените строку 98 в MainActivity на:

flutterEngine?.let {
   val channel = MethodChannel(it.dartExecutor.binaryMessenger, "com.example.contacts")
}
Ответ принят как подходящий

В Котлине (и многих других языках) есть понятие обнуляемых и ненулевых типов. В вашем коде flutterEngine объявлен как обнуляемый, но вы используете его как ненулевой тип, отсюда и ошибка компиляции.

Вам нужно точно описать, что должно произойти, когда объект flutterEngine имеет значение null, а также когда он не равен нулю. Один из способов — использовать функцию области видимости let :

flutterEngine?.let { notNullFlutterEngine ->
    // Use notNullFlutterEngine as you previously did.
    val channel = MethodChannel(notNullFlutterEngine.dartExecutor.binaryMessenger, "com.example.contacts")
    channel.invokeMethod("getContacts", contacts)
} 

Я настоятельно рекомендую прочитать ранее связанные страницы в документации.

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