Как получить отправляемые пакеты? - PullRequest
0 голосов
/ 03 июля 2018

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

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
}

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

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

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

UPDATE Если навести курсор на переменные в классе, он скажет: Property not serialized as parcel. Похоже, что вещи не работают, как я хотел ... Что дает?

1 Ответ

0 голосов
/ 03 июля 2018

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

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

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

...