Kotlin Android Studio - Разрешены только безопасные (?.) Или ненулевые вызовы (!!.) На обнуляемом приемнике типа Intent? - PullRequest
0 голосов
/ 01 июля 2019

Я получаю этот код ошибки во время прохождения Android Studio 3.0 Development Essentials.Msgstr "Только допустимые (?.) Или ненулевые вызовы (!!.) Разрешены для обнуляемого получателя типа Intent?".Не уверен почему.Приведенный выше код - это то, с чем я сейчас работаю, и «Намерение» автоматически сгенерировало знак вопроса.Нижний код - это то, что показано в книге.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if ((requestCode == request_code) && (resultCode == Activity.RESULT_OK)) {
        if (data.hasExtra("returnData")) {
            val returnString = data.extras.getString("returnData")
            textView1.text = returnString
        }
    }
}

Код в книге

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if ((requestCode == request_code) && (resultCode == RESULT_OK)) {
        if (data.hasExtra("returnData")) {
            val returnString = data.extras.getString("returnData")
            textView1.text = returnString
        }
    }
}

Ответы [ 4 ]

1 голос
/ 01 июля 2019

Ошибка, если вы пришли из Swift, в основном потому, что подпись:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

Указывает, что параметр data типа Intent? имеет тип "Nullable" (необязательно в Swift),Это означает, что вы должны разыменовать Необязательный сначала.

В Kotlin (как в Swift) вы делаете это с пометкой ?.

if (data?.something)

Означает, что если данные равны нулю или что-то ложно / ноль (в зависимости от ихвведите), тогда if будет не ввести свой блок.

то же самое для:

if (data?.something && data?.somethingElse)

Это не приведет к сбою, если данные равны нулю, и будет проходить только условиеесли оба значения something и somethingElse имеют значение true (или ненулевое значение для не примитивов).

Книга, вероятно, ссылается на старую версию Kotlin или плагин Kotlin-Android, где полученное Намерение не является обязательным и поэтому не может быть нулевым.

Всеэто лучше объяснить в главе Nullability * Kotlin :)

0 голосов
/ 01 июля 2019

Это связано с тем, что вы обращаетесь к hasExtra в переменной data, не проверяя, является ли переменная data ненулевой, поскольку вы объявили data обнуляемым (то есть с добавлением ? кIntent), следовательно, вы получите эту ошибку.Решение может быть одним из следующих:

  1. Добавить безопасный оператор (?.) * (Рекомендуется): data.hasExtra(/* ... */) -> data?.hasExtra(/* ... */))
  2. Добавить ненулевой оператор (!!) * (не рекомендуется, если только вы не знаете, что значение всегда будет ненулевым) *: data.hasExtra(/* ... */) -> data!!.hasExtra(/* ... */)
  3. Добавить условие впроверьте, не является ли data ненулевым, прежде чем продолжить: data.hasExtra(/* ... */) -> data != null && data.hasExtra(/* ... */) (Примечание: Kotlin автоматически воспримет значение data как ненулевое для кода внутри условия data != null)
0 голосов
/ 01 июля 2019

Вы можете использовать умные приведения, которые в этом случае автоматически приведут Intent? к Intent, если вы явно отметите data != null перед использованием data.

В противном случае просто вставьте нулевые безопасные вызовы методов, например data?.hasExtra("returnData")), где это необходимо.

0 голосов
/ 01 июля 2019

Ваш intent имеет значение NULL, вы должны получить доступ к его свойствам с помощью ? или проверить его на нулевое значение, прежде чем его использовать:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (data != null && (requestCode == request_code) && (resultCode == Activity.RESULT_OK)) {
        if (data.hasExtra("returnData")) {
            val returnString = data.extras.getString("returnData")
            textView1.text = returnString
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...