我正在尝试为活动创建构建器。原因是因为可以通过许多不同的方式启动此活动。我创建了一个像这样的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”字段。我需要在某个时候调用该函数,但是它是不可拆分的,因此在开始活动时无法通过意图传递它。
如果有人有解决方案,我将不胜感激!
这是我发现的一种解决方案,可能不是最优雅的。我使用父上下文创建了一个广播接收器,该广播接收器与我的活动同时开始。
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)
}