¡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:
var
La propiedad decorada implementa la delegación de propiedades y necesita implementar laReadWriteProperty
interfazval
La propiedad decorada implementa la delegación de propiedades y necesita implementar laReadOnlyProperty
interfaz
Aquí, dado que solo necesitamos leer el valor, podemos implementar directamente la ReadOnlyProperty
interfaz. Lo siguiente está directamente en el Intent
có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í Intent
tiene por defecto el nombre del atributo: property.name
, lo que significa que Intent
la clave también debe usar el nombre del atributo al almacenar el valor.
Intent
Si no desea utilizar el nombre de la propiedad si necesita leer y escribir , key
debe modificar ligeramente la clase de delegado de la propiedad IntentWrapper
, y el constructor admite la transferencia de key
valores clave desde el exterior.
En la clase de delegación de atributo anterior , el tipo de suma IntentWrapper
simplemente se procesa , y usted mismo debe agregar otros tipos y otros tipos.String
Int
Boolean
Float
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 IntentWrapper
y 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, Intent
y el procesamiento de Fragmento es Argument
similar:
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