Как получить доступ к экземпляру класса данных в другой деятельности? - PullRequest
0 голосов
/ 31 марта 2019

Я хотел бы создать экземпляр класса данных внутри моей PlayerDetails.kt активности, а затем получить доступ к его данным в другой активности позже.

Я делаю это, потому что не хочупостоянно передавать данные между действиями, используя Intent.putString, Intent.putInt или Shared Preferences, поскольку данные полезны только для текущего сеанса.Я просто хочу получать данные по запросу, когда мне здесь нравится.

PlayerDetails.kt

class PlayerDetails : AppCompatActivity() {
    ...
    val player1 = Player(name="james", age=23, gender="male")
    val player2 = Player(name="sophie", age=38, gender="female")
}

Player.kt

data class Player (
    val name: String,
    val age: Int,
    val gender: String
)

Поскольку у меня несколько игроков,Можно ли создать несколько Player экземпляров в PlayerDetails.kt и иметь возможность доступа к ним по отдельности в более позднем упражнении?

1 Ответ

2 голосов
/ 31 марта 2019

Я делаю это, потому что не хочу постоянно передавать данные между действиями, используя Intent.putString, Intent.putInt или Shared Preferences, так как данные полезны только для текущего сеанса.

Ты говоришь так, будто хочешь съесть свой пирог и съесть его;что является проблемой, потому что если вы не используете Intent bundle и не используете постоянство диска;тогда вам по крайней мере потребуется реализовать BaseActivity.onSaveInstanceState(), иначе ваш бедный пользователь потеряет свои данные (состояние), когда через некоторое время вернется в ваше приложение;)

Представьте себе, вы задали поля в Activity1Я перехожу к Activity3, затем получаю телефонный звонок, который занимает 20 минут.Тем временем Android завершает работу моего приложения, я возвращаюсь с телефонного звонка, приложение запускается с нуля на Activity3, и материал, который я предположительно установил в Activity1, но никогда не сохранял каким-либо образом, теперь null или "" или0.Не очень хороший UX, особенно когда он вызывает сбои.


Простое решение для вашего сценария состоит в том, чтобы вместо разложения вашего Player вручную каждый раз, просто используйте @Parcelize.

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

androidExtensions {
    experimental = true
}

Тогда

@Parcelize data class Player: Parcelable (
    val name: String,
    val age: Int,
    val gender: String
)

И

// inline fun <reified T: Activity> Activity.intentFor(builder: Intent.() -> Unit) {
//     return Intent(this, T::class.java).apply(builder)
// }

startActivity(intentFor<OtherActivity>() {
    putParcelableExtra("player", player)
})

val player = intent.getParcelableExtra("player")
...