Crie o hábito de escrever juntos! Este é o 8º dia da minha participação no "Nuggets Daily New Plan · April Update Challenge", clique para ver os detalhes do evento .
Este artigo implementará o elegante encapsulamento de leitura e gravação da intenção da atividade e do argumento do fragmento da perspectiva da delegação de atributos
Existem duas maneiras de implementar a delegação de propriedades. Aqui, ela é implementada diretamente pela implementação da interface:
var
A propriedade decorada implementa a delegação de propriedade e precisa implementar aReadWriteProperty
interfaceval
A propriedade decorada implementa a delegação de propriedade e precisa implementar aReadOnlyProperty
interface
Aqui, como só precisamos ler o valor, podemos implementar diretamente a ReadOnlyProperty
interface. O seguinte está diretamente no Intent
código de leitura do delegado da atividade:
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
}
}
复制代码
Deve-se observar que a chave usada para ler a Activity aqui Intent
tem como padrão o nome do atributo: property.name
, o que significa que Intent
a chave também deve usar o nome do atributo ao armazenar o valor.
Intent
Se você não quiser usar o nome da propriedade se precisar ler e escrever , key
precisará modificar um pouco a classe de delegado da propriedade IntentWrapper
, e o construtor suporta a passagem de key
valores de chave de fora.
Na classe de delegação de atributo acima , o tipo de soma IntentWrapper
é simplesmente processado e outros tipos e outros tipos precisam ser adicionados por você.String
Int
Boolean
Float
Dê uma olhada no uso:
private val data by IntentWrapper(56)
//读
printlin(data)
复制代码
O acima ainda é um pouco deselegante de usar. Você precisa criar IntentWrapper
e passar manualmente o valor padrão todas as vezes. Podemos encapsular vários tipos comuns de métodos, que são mais convenientes de implementar:
fun intIntent(default: Int = 0) = IntentWrapper(default)
fun stringIntent(default: String = "") = IntentWrapper(default)
复制代码
intIntent()
O método fornece um valor padrão de 0, um valor padrão que pode ser opcionalmente passado de fora, e outros tipos são tratados da mesma maneira.
Então pode ser usado assim:
private val data by intIntent()
复制代码
O acima mostra principalmente a leitura de Activity, Intent
e o processamento de Fragment é Argument
semelhante:
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
}
}
复制代码
Também é semelhante ao Activity, então não vou mostrá-lo aqui. Claro, vários tipos comuns de métodos podem ser definidos aqui ArgumentWrapper
, basta consultar o processamento de atividade acima.
Um artigo de acompanhamento será preparado para considerar a leitura 类委托
sob a perspectiva do encapsulamento .Activity的Intent、Fragment的Argument