Как я могу оптимизировать код для функции расширения контекста, фрагмента и действия в Kotlin?

#android #kotlin #kotlin-extension

#Android #kotlin #kotlin-расширение

Вопрос:

Код A является функцией расширения для Context , Fragment и Activity .

Я думаю, что это избыточно, как я могу это оптимизировать?

Код A

     fun Context.toast(msg: String){
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show()
    }
    
    fun Context.toast(@StringRes resId: Int){
        toast(getString(resId))
    }
    
    fun Context.toast(@StringRes resId: Int,msg: String){
        toast(getString(resId)   msg)
    }
    
    fun Context.toast(msg: String,@StringRes resId: Int){
        toast(msg   getString(resId))
    }
    
    //------------------------------------------------

    fun Fragment.toast(msg:String) {
        requireContext().toast(msg)
    }
    
    fun Fragment.toast(@StringRes resId: Int) {
        toast(requireContext().getString(resId))
    }
    
    fun Fragment.toast(@StringRes resId: Int, msg: String) {
        toast(requireContext().getString(resId)   msg)
    }
    
    fun Fragment.toast( msg: String, @StringRes resId: Int) {
        toast(msg  requireContext().getString(resId))
    }
    
    //------------------------------------------------

    fun Activity.toast(msg: String){
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show()
    }
    
    fun Activity.toast(@StringRes resId: Int){
        toast(getString(resId))
    }
    
    fun Activity.toast(@StringRes resId: Int,msg: String){
        toast(getString(resId)   msg)
    }
    
    fun Activity.toast(msg: String,@StringRes resId: Int){
        toast(msg   getString(resId))
    }
  

Комментарии:

1. вам не нужно реализовывать функции расширения для Activity , поскольку Activity расширяет Context

Ответ №1:

Функций расширения контекста должно быть достаточно. Вы сможете использовать его практически в любом месте, где доступен компонент пользовательского интерфейса.

Мы можем удалить расширения для, Activity потому что Activity это косвенный подкласс Context class.

И мы также можем удалить Fragment расширения, потому что они бесполезны, пока фрагмент не будет присоединен к действию (которое является контекстом).

 fun Context.toast(msg: String){
    Toast.makeText(this, msg, Toast.LENGTH_LONG).show()
}

fun Context.toast(@StringRes resId: Int){
    toast(getString(resId))
}

fun Context.toast(@StringRes resId: Int,msg: String){
    toast(getString(resId)   msg)
}

fun Context.toast(msg: String,@StringRes resId: Int){
    toast(msg   getString(resId))
}
  

Эти функции могут быть использованы в действии:

Использование функций расширения в действии

И во фрагменте. Логически правильно и преднамеренно, что мы должны сначала получить ссылку на Context :

Использование функций расширения во фрагменте

Комментарии:

1. requireContext () может вызвать исключение IllegalStateException, если фрагмент не прикреплен!

2. @ArpitJ. Правильно. Это указано в документации к этому методу: developer.android.com/reference/androidx/fragment/app /… .