Android-如何将函数传递给Activity?

问题描述 投票:0回答:1

我正在尝试为活动创建构建器。原因是因为可以通过许多不同的方式启动此活动。我创建了一个像这样的Builder类:

class ActivityBuilder {

    private var showToolBar = false
    private var postExecutable: (() -> Unit)? = null

    fun showToolbar(boolean: Boolean) : ActivityBuilder {
        this.showToolBar = boolean
        return this
    }

    fun setPostExecutable(function: () -> Unit) : ActivityBuilder {
        this.postExecute = function
        return this
    }

    fun start(context: Context){
        val intent = Intent(context, Activity::class.java)
        context.startActivity(intent)
    }
}

想法是调用这样的名称并可以访问活动内部的这些字段。

 ActivityBuilder().showToolbar(false).setPostExecutable { { doSomething() } }.start(this)

我想我也可以使用一个伴随对象,这将达到相同的目的。

companion object Builder {

    private var showToolBar = false
    private var postExecute: (() -> Unit)? = null

    fun showToolbar(boolean: Boolean) : Builder {
        this.showToolBar = boolean
        return this
    }

    fun setPostExecutable(function: () -> Unit) : Builder {
        this.postExecute = function
        return this
    }

    fun start(context: Context){
        val intent = Intent(context, AuthActivity::class.java)
        context.startActivity(intent)
    }
}

问题主要来自“ postExecutable”字段。我需要在某个时候调用该函数,但是它是不可拆分的,因此在开始活动时无法通过意图传递它。

如果有人有解决方案,我将不胜感激!

android kotlin android-activity builder
1个回答
0
投票

这是我发现的一种解决方案,可能不是最优雅的。我使用父上下文创建了一个广播接收器,该广播接收器与我的活动同时开始。

class ActivityBuilder(private val context: Context) {

    private var postSuccessExecutable: (() -> Unit)? = null
    ...
    private fun setupReceiver(){

        val filter = IntentFilter()
        filter.addAction("SUCCESS")

        val receiver = object : BroadcastReceiver() {
            override fun onReceive(c: Context?, intent: Intent?) {

                context.unregisterReceiver(this)

                if (intent?.action == "SUCCESS"){
                    Toast.makeText(context, "Successful", Toast.LENGTH_SHORT).show()
                    postSuccessExecutable?.invoke()
                }
            }
        }

        context.registerReceiver(authReceiver, filter)
    }
    ...
}

当我想触发该功能时,我只是发送广播:

private fun sendSuccessBroadcast(data: String){
    val intent = Intent()
    intent.action = "SUCCESS"
    intent.putExtra("data", String)
    requireContext().sendBroadcast(intent)
}
© www.soinside.com 2019 - 2024. All rights reserved.