Повторное использование методов в Kotlin, Android - PullRequest
0 голосов
/ 16 декабря 2018

Мне нужно открыть одно действие из нескольких разных точек в приложении.Скажем, из раздела «Настройки», «Основной активности» и «Навигационной панели» (фрагмент)Я не хочу копировать / вставлять один и тот же метод и метод очень специфичен, он должен быть точно таким же (потому что он регистрирует события Firebase).Как эффективно структурировать код?Где поставить этот метод?Одна идея состоит в том, чтобы иметь глобальный файл ActivityUtils.kt только с методами, и он будет использоваться для хранения этих методов.Мне интересны альтернативы и каковы плюсы и минусы каждого.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Я бы создал companion object в действии, которое нужно открыть:

class YourActivity : AppCompatActivity() {

    companion object {
        fun start(ctx: Context) {
            // put your logic here (registering of Firebase events)

            val i = Intent(ctx, YourActivity::class.java)
            ctx.startActivity(i)
         }
    }
}

и вызвал бы его из другого занятия:

YourActivity.start(this)

или из другого фрагмента:

YourActivity.start(context)
0 голосов
/ 17 декабря 2018

Почему бы не использовать MVP?Мол,

interface IView { 
    val context: Context 
}

interface IPresenter { 
    fun launchActivity(view: IView) 
}

class MyActivityModel
{
    var key = "key"
    /*some other data*/

    fun getParcelableObject(): Parcelable
    {
        return /*some parcelable from model data*/
    }
}

class MyActivity : AppCompatActivity(), IView
{
    override val context: Context
        get() = this
}

class MyActivityPresenter() : IPresenter
{
    private var model: MyActivityModel = MyActivityModel()

    override fun launchActivity(view: IView)
    {
        val intent = Intent(view.context, MyActivity::class.java)
        intent.putExtra(model.key, model.getParcelableObject())
        view.context.startActivity(intent)
    }

    fun setSomeDataToModel(someData: Any) {

    }
}

/*Everyone who wants to use presenter, must be a Context and implement IView*/
fun use()//in some fragment, or activity implementing IView
{
    MyActivityPresenter().launchActivity(this)
    //or
    val presenter = MyActivityPresenter()
    presenter.setSomeDataToModel("some data")
    presenter.launchActivity(this)
}
0 голосов
/ 16 декабря 2018

Используйте метод расширения:

fun Activity.doMyStuff() {}

, который может быть вызван из любого расширяющего класс Activity.внутри файла.Так что, если вы хотите создать файл ActivityUtils.kt, в нем нет ничего типа class ActivityUtils {}.Функция (и) должна идти прямо в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...