Я создаю такой пакет:
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. Похоже, что все работает не так, как я планировал ... Что дает?
О, это просто я пробую разные объектные переменные. Я уверен, что это не ноль. Обновлю вопрос. Спасибо, что указали на это :)
Постараюсь подсказать ответ. Пожалуйста, подтвердите, что это работает :)
Попробуйте выполнить рефакторинг своего 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
Я переместил все свойства в круглые скобки (у вас фигурные скобки) и переместил интерфейс в конец. Также добавлены запятые, так как они уже являются параметрами
Чувак, это сработало! Крутой мужик. Большое спасибо за то, что нашли время мне помочь! : D Как ты думаешь, ты мог бы немного рассказать о том, что я только что сделал?
Это связано с тем, как Kotlin реализует Parcelize. В вашем предыдущем определении класса все объявлено как свойства. Следовательно, когда вы создаете экземпляр своего класса с помощью конструктора по умолчанию, вы должны инициализировать свои свойства вручную. Я думаю, что Parcelize вызывает только основной конструктор, поэтому он может создать экземпляр вашего класса, но не может устанавливать значения свойств. Вот почему все равно нулю. Чтобы решить эту проблему, вы должны установить свои свойства в качестве основных параметров конструктора, чтобы parcelize мог устанавливать их значения.
Обратите внимание, что @Parcelize - это экспериментальная функция. Реализация и спецификация могут измениться в будущем, так что будьте осторожны.
Вы уверены, что изображение вашего рецепта не пустое? Потому что при первом действии вы проверяете заголовок рецепта. На втором вы проверяете изображение.