Как я могу получить посылку?

Я создаю такой пакет:

val intent = Intent(classContext, Recipes::class.java)

var bundle = Bundle().apply {
                    putParcelableArrayList("LIST", ArrayList<Parcelable>(fbModel.recipeArray))
                    putInt("POSITION", position)
                }

intent.putExtra("bundle", bundle)

//CHECK TO SEE IF DATA IS STORED
var passedIntent = intent.extras
var bundle2: Bundle = passedIntent.getBundle("bundle")
var recipeArray: ArrayList<RecipeTemplate> = bundle2.getParcelableArrayList("LIST")

Log.d("TAGC", " " + recipeArray[0].recipeHeader) //SUCCESS!
Log.d("TAGC", " " + position)                    //SUCCESS!


startActivity(intent)

Чтобы проверить, работает ли это, я создал и зарегистрировал переменные из bundle, и они действительно содержат правильные данные.

Объект класса, хранящийся в массиве RecipeTemplate, называется Parcelized и выглядит следующим образом:

@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate: Parcelable {
    var recipeHeader: String? = null
    var recipeText: String? = null
    var recipeImage: String? = null
    var recipeKey: String? = null
}

Все идет нормально. Но когда я получаю пакет в другом действии, он по какой-то причине возвращает null, хотя я использую тот же точный код, что и выше (тестовый код, чтобы увидеть, сохранил ли пакет правильные данные). Это приемная деятельность:

var passedIntent: Bundle = intent.extras
var bundle = passedIntent.getBundle("bundle")
var counter: Int = bundle.getInt("POSITION", 0)
var recipeArray: ArrayList<RecipeTemplate> = bundle.getParcelableArrayList("LIST")

Log.d("TAGA", "PASSED " + counter) //SUCCESS
Log.d("TAGA", "PASSED " + recipeArray[0].recipeHeader) //FAIL: null

Переменная счетчик / позиция возвращает правильные данные, но по какой-то причине recipeArray имеет значение NULL. Опять же, это сработало в предыдущем упражнении, поэтому я не понимаю, почему на этот раз все по-другому ... Есть идеи?

ОБНОВИТЬ Если я наведу курсор на переменные в классе, он скажет: Property not serialized as parcel. Похоже, что все работает не так, как я планировал ... Что дает?

Вы уверены, что изображение вашего рецепта не пустое? Потому что при первом действии вы проверяете заголовок рецепта. На втором вы проверяете изображение.

tompee 03.07.2018 08:42

О, это просто я пробую разные объектные переменные. Я уверен, что это не ноль. Обновлю вопрос. Спасибо, что указали на это :)

tore 03.07.2018 08:51

Постараюсь подсказать ответ. Пожалуйста, подтвердите, что это работает :)

tompee 03.07.2018 08:54
0
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте выполнить рефакторинг своего RecipeTemplate, чтобы вместо этого принимать свойства в качестве параметров в конструкторе.

@SuppressLint("ParcelCreator")
@Parcelize
class RecipeTemplate (
    var recipeHeader: String? = null,
    var recipeText: String? = null,
    var recipeImage: String? = null,
    var recipeKey: String? = null
) : Parcelable

Проблема может заключаться в способе реализации посылки. Я не могу найти никакой документации по этому поводу, но есть большая вероятность, что createFromParcel просто вызывает только основной конструктор. Это все еще экспериментально и может измениться в будущем. Хотя я могу ошибаться и рад, что меня поправили.

Вы только что добавили : Parcelable? Я пробовал, но там написано, что Expecting a top level declaration

tore 03.07.2018 09:17

Я переместил все свойства в круглые скобки (у вас фигурные скобки) и переместил интерфейс в конец. Также добавлены запятые, так как они уже являются параметрами

tompee 03.07.2018 09:19

Чувак, это сработало! Крутой мужик. Большое спасибо за то, что нашли время мне помочь! : D Как ты думаешь, ты мог бы немного рассказать о том, что я только что сделал?

tore 03.07.2018 09:28

Это связано с тем, как Kotlin реализует Parcelize. В вашем предыдущем определении класса все объявлено как свойства. Следовательно, когда вы создаете экземпляр своего класса с помощью конструктора по умолчанию, вы должны инициализировать свои свойства вручную. Я думаю, что Parcelize вызывает только основной конструктор, поэтому он может создать экземпляр вашего класса, но не может устанавливать значения свойств. Вот почему все равно нулю. Чтобы решить эту проблему, вы должны установить свои свойства в качестве основных параметров конструктора, чтобы parcelize мог устанавливать их значения.

tompee 03.07.2018 09:33

Обратите внимание, что @Parcelize - это экспериментальная функция. Реализация и спецификация могут измениться в будущем, так что будьте осторожны.

tompee 03.07.2018 09:35

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