Как не создавать каждый раз новый объект?

#android #kotlin #mvvm

#Android #kotlin #mvvm

Вопрос:

Как я могу прекратить создавать quoteData переменную каждый раз в моей модели представления?

Это решение работает, но количество повторяющегося кода ужасает

 class QuoteDetailsViewModel(application: Application) : AndroidViewModel(application) {

    private val quoteRepository: QuoteRepository = QuoteRepository(application)

    private val quoteId = MutableLiveData<String>("")
    val quoteAuthor = MutableLiveData<String>("")
    val quoteContent = MutableLiveData<String>("")
    val quoteDescription = MutableLiveData<String>("")
    val quoteLastUpdate = MutableLiveData<String>("")

    val onSaveClickEvent = MutableLiveData<ViewModelEvent<Unit>>()
    val onCancelClickEvent = MutableLiveData<ViewModelEvent<Unit>>()
    val onDeleteClickEvent = MutableLiveData<ViewModelEvent<String?>>()
    var isNewQuote = false

    fun setInitialData(arguments: Bundle?) {
        if (arguments != null) {
            val quoteData = arguments.getSerializable(KEY_DATA) as Quote
            isNewQuote = false
            quoteData.let { quote ->
                quoteId.postValue(quote.id)
                quoteAuthor.postValue(quote.author)
                quoteContent.postValue(quote.quote)
                quoteDescription.postValue(quote.description)
                quoteLastUpdate.postValue(quote.lastUpdated.getFormattedDate())
            }
        } else {
            isNewQuote = true
        }
    }

    fun onViewClick(viewId: Int) {
        val currentTime = Calendar.getInstance().time
        when (viewId) {
            R.id.actionSave -> {
                if (!isNewQuote) {
                    val quoteData = Quote(
                        id = this.quoteId.value ?: "",
                        author = this.quoteAuthor.value ?: "",
                        quote = this.quoteContent.value ?: "",
                        description = this.quoteDescription.value ?: "",
                        lastUpdated = currentTime
                    )
                    quoteRepository.update(quoteData)

                } else {
                    val quoteData = Quote(
                        id = UUID.randomUUID().toString(),
                        author = this.quoteAuthor.value ?: "",
                        quote = this.quoteContent.value ?: "",
                        description = this.quoteDescription.value ?: "",
                        lastUpdated = currentTime
                    )
                    quoteRepository.insert(quoteData)
                }
                onSaveClickEvent.postValue(ViewModelEvent(Unit))
            }
            R.id.actionCancel -> onCancelClickEvent.postValue(ViewModelEvent(Unit))
            R.id.actionDelete -> onDeleteClickEvent.postValue(ViewModelEvent(this.quoteId.value))
        }
    }

    fun onDeleteItemResult(guid: String?) {
        val currentTime = Calendar.getInstance().time
        val quoteData = Quote(
            id = guid ?: "",
            author = this.quoteAuthor.value ?: "",
            quote = this.quoteContent.value ?: "",
            description = this.quoteDescription.value ?: "",
            lastUpdated = currentTime
        )
        quoteRepository.delete(quoteData)
    }

    companion object {
        fun newBundle(quote: Quote?): Bundle {
            return Bundle().apply {
                putSerializable(KEY_DATA, quote)
            }
        }
    }
}
  

Также вот код моей цитаты:

 @Entity(tableName = "quotes")
class Quote(
    @PrimaryKey
    val id: String,

    val author: String,
    val quote: String,
    val description: String,

    @ColumnInfo(name = "last_updated")
    val lastUpdated: Date?
) : Serializable
  

И вот код, когда я нажимаю на элемент списка

 val allQuotes: LiveData<List<Quote>>

init {
    allQuotes = quoteRepository.allQuotes
}

fun onListItemClick(itemIndex: Int) {
    onListItemClickEvent.postValue(
        ViewModelEvent(QuoteDetailsViewModel.newBundle(allQuotes.value?.getOrNull(itemIndex)))
    )
}
  

Затем я перехожу к своей модели представления — QuoteDetailsViewModel

Комментарии:

1. Создайте функцию, которая заполняет идентичные аргументы и возвращает Quote .

2. Я бы использовал один MutableLiveData<Quote> вместо всех отдельных оперативных данных. Создайте Quote неизменяемый класс данных.

3. @Tenfour04 но Quote это мой класс @Entity. Я обновил вопрос. Можете ли вы проверить, пожалуйста?