Leia elegantemente Intenção de Atividade e Argumento de Fragmento

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:

  • varA propriedade decorada implementa a delegação de propriedade e precisa implementar a ReadWritePropertyinterface
  • valA propriedade decorada implementa a delegação de propriedade e precisa implementar a ReadOnlyPropertyinterface

Aqui, como só precisamos ler o valor, podemos implementar diretamente a ReadOnlyPropertyinterface. O seguinte está diretamente no Intentcó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 Intenttem como padrão o nome do atributo: property.name, o que significa que Intenta chave também deve usar o nome do atributo ao armazenar o valor.

IntentSe você não quiser usar o nome da propriedade se precisar ler e escrever , keyprecisará modificar um pouco a classe de delegado da propriedade IntentWrapper, e o construtor suporta a passagem de keyvalores 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ê.StringIntBooleanFloat

Dê uma olhada no uso:

private val data by IntentWrapper(56)

//读
printlin(data)
复制代码

O acima ainda é um pouco deselegante de usar. Você precisa criar IntentWrappere 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, Intente o processamento de Fragment é Argumentsemelhante:

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

Acho que você gosta

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