【问题标题】:Callback with parameters with Kotlin使用 Kotlin 进行参数回调
【发布时间】:2018-04-19 17:27:42
【问题描述】:

我刚开始使用 Kotlin,所以请多多关照 :)

我有一个类负责获取一些数据并通知主要活动它需要更新其 UI。

所以我在我的 DataProvider.kt 中创建了一个函数:

      fun getPeople(fromNetwork: Boolean, results: ((persons: Array<Person>, error: MyError?) -> Unit)) {

        // do some stuff stuff
        val map = hashMapOf(
                "John" to "Doe",
                "Jane" to "Smith"
        )

        var p = Person(map)
        val persons: Array <Person> = arrayOf (p)
        results(persons, null)
    }

所以我想从我的活动中调用它,但我找不到正确的语法! :

    DataProvider.getPeople(
            true,
            results =
    )

我尝试了很多事情,但我只想获取我的人员数组和我的可选错误,以便我可以更新 UI。

目标是在我的数据提供程序中执行异步代码,以便我的活动可以等待它。

有什么想法吗?非常感谢您的帮助。

【问题讨论】:

    标签: java android callback kotlin


    【解决方案1】:

    这实际上取决于您如何定义回调方法。如果您使用独立函数,请使用 :: 运算符。首先(当然),我应该解释一下语法:

    (//these parenthesis are technically not necessary
    (persons: Array<Person>, error: MyError?)//defines input arguments: an Array of Person and a nullable MyError
         -> Unit//defines the return type: Unit is the equivalent of void in Java (meaning no return type)
    )
    

    所以方法定义为:

    fun callback(persons: Array<CustomObject>, error: Exception?){
        //Do whatever
    }
    

    你这样称呼它:

    DataProvider.getPeople(
        true,
        results = this::callback
    )
    

    但是,如果您使用匿名回调函数,则略有不同。这也使用 lambda:

    getPeople(true, results={/*bracket defines a function. `persons, error` are the input arguments*/persons, error ->  {
            //do whatever
        }})
    

    【讨论】:

    • 您好,非常感谢,您能告诉我匿名回调函数和独立函数有什么区别吗?哪个更好?
    • 没有一个真的比另一个更好,你使用哪个真的取决于你喜欢哪个,以及你是否打算在其他地方使用它。如果您要多次编写代码或将该方法作为非回调方法(或作为不同调用的回调)调用,请使用独立方法。否则使用匿名函数。但是实际上并没有任何“规则”(这些只是我个人的喜好),所以你基本上可以选择你喜欢的任何一个
    【解决方案2】:

    是的,Kotlin 有一种使用回调函数的好方法,我将在下面向您展示我如何使用它们的示例:

    fun addMessageToDatabase(message: String, fromId: String, toId: String,
                                    addedMessageSuccessHandler: () -> Unit,
                                    addedMessageFailureHandler: () -> Unit) {
    
    
    
        val latestMessageRef = mDatabase.getReference("/latest-messages/$fromId/$toId")
        latestMessageRef.setValue(message).addOnSuccessListener {
            latestMessageUpdateSuccessHandler.invoke()
    
        }.addOnFailureListener {
            latestMessageUpdateFailureHandler.invoke()
        }
    }
    

    最后,您可以通过以下代码使用新的回调

    databaseManager.updateLatestMessageForUsers(message, fromId, toId,
            latestMessageUpdateSuccessHandler = {
                // your success action
            },
            latestMessageUpdateFailureHandler = {
                // your failure action
            })
    

    所以基本上,当我成功地向我的数据库添加新行时,我正在调用对服务调用者的成功或失败响应。希望这会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多