Executando verificação de segurança...
2

Desenvolvendo uma biblioteca de carregamento de imagens

🚀 Apresentando a Nil

A Nil nasceu de um desafio: depois de enfrentar alguns problemas com o Coil, tentei corrigir (afinal, é open source) mas falhei miseravelmente, sem ideia de como uma biblioteca desse tipo funcionava. Então mergulhei fundo em como uma biblioteca desse tipo funciona. Mas para entender de fato, precisa colocar em prática. Assim surgiu a POC que acabou evoluindo para a Nil.

Claro, o Coil é uma biblioteca extremamente robusta e sofisticada, e não há comparação em termos de complexidade e recursos. Mas isso não impede a criação de uma alternativa mais simples e direta, pensada para atender requisitos específicos sem carregar toda a complexidade de um projeto desse porte.


✨ O que torna a Nil especial?

  • Developer Experience em primeiro lugar: pensei em como seria a API ideal e cheguei a um design type safe, extensível e configurável via DSL.
  • Modular e customizável: inspirada nas bibliotecas mais populares, você só precisa importar exatamente o que precisa.
  • Customizável: baseada no padrão Chain of Responsibility, permite adicionar funcionalidades extras com facilidade. Inclusive, as funcionalidades internas já são implementadas dessa forma.
  • Extensibilidade: adicione novos decodificadores e buscadores sem complicação.
  • GIF em todas as plataformas: enquanto o Coil só suporta GIF no Android, a Nil funciona em todas as plataformas.
  • Integração type safe com Compose Resources: algo que o Coil não oferece e que a Nil traz de forma nativa.
  • Código limpo e conciso: escrito para servir de guia, facilitar contribuições e encorajar colaboração da comunidade Kotlin.

A ideia é que qualquer dev Kotlin, com um pouco de dedicação, consiga contribuir com novas funcionalidades — o que seria incrível!


🤝 Como você pode contribuir

Sua ajuda é muito bem-vinda, seja:

  • Testando e dando feedback
  • Fazendo sugestões
  • Contribuindo com código diretamente

⚡ Início rápido

// Gradle
implementation("com.neoutils.nil:core:0.1.0-alpha05")
implementation("com.neoutils.nil:bitmap-decoder:0.1.0-alpha05")
implementation("com.neoutils.nil:network-fetcher-default:0.1.0-alpha05")

// Painter
Image(
    painter = asyncPainterResource(
        Request.network("https://cataas.com/cat")
    ),
    contentDescription = null,
)

📦 Decodificadores disponíveis

implementation("com.neoutils.nil:bitmap-decoder:0.1.0-alpha05")
implementation("com.neoutils.nil:svg-decoder:0.1.0-alpha05")
implementation("com.neoutils.nil:gif-decoder:0.1.0-alpha05")
implementation("com.neoutils.nil:xml-decoder:0.1.0-alpha05")

🌐 Buscadores disponíveis

implementation("com.neoutils.nil:network-fetcher:0.1.0-alpha05")
implementation("com.neoutils.nil:resources-fetcher:0.1.0-alpha05")

⚡ Funcionalidades extras

implementation("com.neoutils.nil:memory-cache:0.1.0-alpha05")
implementation("com.neoutils.nil:disk-cache:0.1.0-alpha05")
Carregando publicação patrocinada...