0

我正在尝试为活动创建一个生成器。原因是这个活动可以以多种不同的方式开始。我创建了一个这样的 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”字段。我需要在某个点调用该函数,但它不可打包,因此在启动活动时我无法通过意图传递它。

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

4

1 回答 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)
}
于 2020-04-21T17:26:13.213 回答