Android - Как передать функцию в активность? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать Builder для действия. Причина в том, что эта деятельность может быть запущена разными способами. Я создал класс 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". Мне нужно вызвать функцию в определенный момент, но она не подлежит продаже, поэтому я не могу передать ее через намерение при запуске действия.

Если у кого-то есть решение, я ценю это!

1 Ответ

0 голосов
/ 21 апреля 2020

Это одно решение, которое я нашел, возможно, не самое элегантное. Я создал широковещательный приемник, который я запускаю одновременно со своей деятельностью, используя родительский контекст.

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)
}
...