Textview 显示 "androidx.livecycle.CoroutineLiveData"

Textview dispalys "androidx.livecycle.CoroutineLiveData"

我想在文本视图中显示房间数据库中一列的总和。 执行我的查询并设置 Textview 的文本后,它显示如下:

androidx.lifecycle.CoroutineLiveData@76f6edd

知道为什么会这样吗?是因为我的查询不起作用还是我的实现方式有误? 这是我第一次真正编程。我知道我的大部分代码可能不是 100% 正确,但我正在努力。

来自我道的查询:

@Query("SELECT SUM(total)AS sum_total FROM receipt_table")
    fun getSum(): Flow<Float>

片段:

@AndroidEntryPoint
class HistoryFragment : Fragment(R.layout.fragment_history) {

private val viewModel: PurchaseViewmodel by viewModels()


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_history, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val binding = FragmentHistoryBinding.bind(view)

    val exampleAdapter = ExampleAdapter()

    binding.apply{
        recyclerView.apply{

            layoutManager = LinearLayoutManager(requireContext())
            adapter = exampleAdapter

        }
        totalSumTextView.apply {
            val totalSum = viewModel.totalSum
            text = totalSum.toString()
        }
        ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                return false 
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                val receipt = exampleAdapter.currentList[viewHolder.adapterPosition]
                 viewModel.onSwipe(receipt)
            }
        }).attachToRecyclerView(recyclerView)
    }

    setFragmentResultListener("add_receipt_request"){_,bundle ->
        val result = bundle.getInt("add_receipt_request")
        viewModel.onAddResult(result)
    }

    viewModel.receipts.observe(viewLifecycleOwner){ 
        exampleAdapter.submitList(it)
    }


    viewLifecycleOwner.lifecycleScope.launchWhenStarted {
        viewModel.addTaskEvent.collect {  event->
            when(event){
                is PurchaseViewmodel.TasksEvent.ShowUndoDelete -> {
                    Snackbar.make(requireView(),"Tasks deleted", Snackbar.LENGTH_LONG)
                        .setAction("UNDO"){
                            viewModel.unDoDeleteClick(event.receipts)
                        }.show()
                }
            }
        }
    }
}
}

和视图模型:

@HiltViewModel
class PurchaseViewmodel @Inject constructor(
private val receiptDao: ReceiptDao
    ): ViewModel() {
private val tasksEventChannel = Channel<TasksEvent>()
val addTaskEvent = tasksEventChannel.receiveAsFlow()
val receipts = receiptDao.getAllReceipts().asLiveData()
val totalSum = receiptDao.getSum().asLiveData()

fun onAddResult(result: Int){
    when (result){
        ADD_RECEIPT_RESULT_OK ->showReceiptSavedConfirmation("Receipt has been saved")
    }
}
private fun showReceiptSavedConfirmation (text: String) = viewModelScope.launch {
    tasksEventChannel.send(TasksEvent.ShowReceiptSavedConfirmation(text))
}

fun onSwipe (receipts: Receipts) = viewModelScope.launch {
    receiptDao.delete(receipts)
    tasksEventChannel.send(TasksEvent.ShowUndoDelete(receipts))
}
fun unDoDeleteClick (receipts: Receipts) = viewModelScope.launch {
    receiptDao.insert(receipts)
}

sealed class TasksEvent {
    data class ShowReceiptSavedConfirmation(val msg: String) : TasksEvent()
    data class ShowUndoDelete(val receipts: Receipts) : TasksEvent()
}
}

您在这里得到一个 LiveData 对象,而不仅仅是一个值:

 val totalSum = receiptDao.getSum().asLiveData()

当你打电话时:

totalSum.toString()

它在 LiveData 对象上调用 toString 方法,这就是为什么你的 TextView.

中有“androidx.lifecycle.CoroutineLiveData@76f6edd”的原因

要解决此问题,只需替换:

 totalSumTextView.apply {
            val totalSum = viewModel.totalSum
            text = totalSum.toString()
        }

与:

viewModel.totalSum.observe(this) { totalSumTextView.text = it}

详细审查,如何使用 LiveData 您可以在这里找到: https://developer.android.com/topic/libraries/architecture/livedata