如何不每次都创建一个新对象?

时间:2020-08-12 17:27:49

标签: 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

0 个答案:

没有答案
相关问题