如何在 Kotlin 中将(可变)映射传输到数据传输对象 Class?

How to transfer a (Mutable)Map to an Data Transfer Object Class in Kotlin?

我有一个 Firebase 项目,其中包含一个 Firestore 任务集合,这些任务具有以下关联:

我不希望将 Firestore 中的其他字段传递到数据传输对象中,例如 longlat

以下是 Firebase Firestore 数据结构的示例:

我使用快照侦听器来侦听对数据库所做的更改,然后将所需的文档添加到 arrayList,然后我将其显示在回收器视图中

当我尝试运行下面的代码时,出现类型不匹配错误@TaskDTO(taskObj) 我如何允许 TaskDTO class 接受 Map?

代码如下:

val collRef = db.collection("centa_tasks").orderBy("scheduled_date")
        collRef.addSnapshotListener { querySnapshot, firebaseFirestoreException ->

            if (firebaseFirestoreException != null) {
                ...
            }

            ...

            for ((index,doc) in querySnapshot!!.withIndex()) {

                //Get the main values:
                var taskObj = doc.data

                //Add the task_number:
                taskObj["task_number"] = doc.id

                //Here I compare the current date to the previous date to determine if day item needs 
                //to be shown:
                if(index != 0) {
                    val ts1: Timestamp = querySnapshot.documents[index - 1]["scheduled_date"] as Timestamp
                    val ts2: Timestamp = taskObj["scheduled_date"] as Timestamp

                    taskObj["showDate"] = ts1 != ts2
                }else{
                    taskObj["showDate"] = true
                }
                val task = TaskDTO(taskObj) //This is the line of code that needs to be changed. 
                allTasks.add(task) //I add the task to an arrayList that is sent to recycler adapter. 
            }

这是包含可选参数的数据传输对象: TaskDTO.kt:

data class TaskDTO(var site : String,
                   var taskNumber : String,
                   var status: Int,
                   var showDate : Boolean,
                   var scheduled_date : Timestamp = Timestamp(Date(-1)), //optional
                   var description : Int = 1, //optional
                   var location : String = "No location set!", //optional
                   var notes : String = "" //optional
                  ) {

}

当我尝试 运行 上面的代码时,出现类型不匹配错误@TaskDTO(taskObj) 我如何允许 TaskDTO class 接受 Map?

如果我没理解错的话,你正试图用 MutableMap 初始化 TaskDTO,但是你的 TaskDTO class 没有针对这种情况的构造函数。您应该创建新的 class(我在这种情况下使用单例),例如 TaskMapper 使用方法 fun mapTaskDTO(map: MutableMap) 创建和 returns TaskDTO class 基于 MutableMap 实例中的值。 注意! 不应按原样使用此代码。这只是一个例子,它应该告诉你解决问题的方法。

object TaskMapper{
    fun mapTaskDTO(map: MutableMap<String, String>): TaskDTO{
        return TaskDTO(map["site"]!!,
            map["taskNumber"]!!,
            map["status"]!!.toInt(),
            map["showDate"]!!.toBoolean())
    }
}

然后像这里一样使用它

val task = TaskMapper.mapTaskDTO(taskObj)