Lectura elegante Intención de actividad y Argumento de fragmento

¡Acostúmbrate a escribir juntos! Este es el octavo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

Este artículo implementará la elegante encapsulación de lectura y escritura de la intención de la actividad y el argumento del fragmento desde la perspectiva de la delegación de atributos.

Hay dos formas de implementar la delegación de propiedades. Aquí, se implementa directamente mediante la implementación de la interfaz:

  • varLa propiedad decorada implementa la delegación de propiedades y necesita implementar la ReadWritePropertyinterfaz
  • valLa propiedad decorada implementa la delegación de propiedades y necesita implementar la ReadOnlyPropertyinterfaz

Aquí, dado que solo necesitamos leer el valor, podemos implementar directamente la ReadOnlyPropertyinterfaz. Lo siguiente está directamente en el Intentcódigo de lectura del delegado de la Actividad:

class IntentWrapper<T>(private val default: T) : ReadOnlyProperty<AppCompatActivity, T?> {
    override fun getValue(thisRef: AppCompatActivity, property: KProperty<*>): T? {
        return  when(default) {
            is Int -> thisRef.intent.getIntExtra(property.name, default)
            is String -> thisRef.intent.getStringExtra(property.name)
            else -> throw  Exception()
        } as? T
    }
}
复制代码

Cabe señalar que la clave que se usa para leer la actividad aquí Intenttiene por defecto el nombre del atributo: property.name, lo que significa que Intentla clave también debe usar el nombre del atributo al almacenar el valor.

IntentSi no desea utilizar el nombre de la propiedad si necesita leer y escribir , keydebe modificar ligeramente la clase de delegado de la propiedad IntentWrapper, y el constructor admite la transferencia de keyvalores clave desde el exterior.

En la clase de delegación de atributo anterior , el tipo de suma IntentWrappersimplemente se procesa , y usted mismo debe agregar otros tipos y otros tipos.StringIntBooleanFloat

Echa un vistazo a usar:

private val data by IntentWrapper(56)

//读
printlin(data)
复制代码

Lo anterior todavía es un poco poco elegante de usar. Debe crear IntentWrappery pasar manualmente el valor predeterminado cada vez. Podemos encapsular varios tipos comunes de métodos, que son más convenientes de implementar:

fun intIntent(default: Int = 0) = IntentWrapper(default)

fun stringIntent(default: String = "") = IntentWrapper(default)
复制代码

intIntent()El método proporciona un valor predeterminado de 0, un valor predeterminado que se puede pasar opcionalmente desde el exterior, y otros tipos se manejan de la misma manera.

Entonces se puede usar así:

private val data by intIntent()
复制代码

Lo anterior muestra principalmente la lectura de Actividad, Intenty el procesamiento de Fragmento es Argumentsimilar:

class ArgumentWrapper<T>(private val default: T) : ReadOnlyProperty<Fragment, T?> {
    override fun getValue(thisRef: Fragment, property: KProperty<*>): T? {
        return when(default) {
            is Int -> thisRef.arguments?.getInt(property.name, default)
            is String -> thisRef.arguments?.getString(property.name)
            else -> throw Exception()
        } as? T
    }
}
复制代码

También es similar a Actividad, por lo que no lo mostraré aquí. Por supuesto, aquí se pueden definir varios tipos comunes de métodos ArgumentWrapper, solo consulte el procesamiento de actividad anterior.

Se preparará un artículo de seguimiento para considerar la lectura 类委托bajo encapsulación desde la perspectiva .Activity的Intent、Fragment的Argument

Supongo que te gusta

Origin juejin.im/post/7084418325878407181
Recomendado
Clasificación