O “ImageDownloader” lida com como as imagens remotas são baixadas. Ele deve ser usado por qualquer componente de Imagem e nossa intenção ao deixar este ser um serviço configurável é que qualquer lógica adicional para download de imagens possa ser facilmente implementada sem a necessidade de substituir o componente de imagem da biblioteca de componentes que está sendo usada.
Semelhante ao “ViewClient”, o “ImageDownloader” também é responsável por criar solicitações para o “HttpClient” e processar suas respostas, a única diferença é que o “ViewClient” faz isso para visualizações orientadas a servidor (JSONs) e o “ImageDownloader” faz isso para imagens.
O “ImageDownloader” padrão é muito simples, apenas cria a requisição, passa para o HttpClient e transforma a resposta em um Uint8List
. Uma aplicação interessante de um “ImageDownloader” personalizado seria o cache. O “ImageDownloader” personalizado salvaria as imagens em disco e usaria o valor armazenado em vez de fazer a solicitação ao “HttpClient” sempre que possível.
Aqui está a interface do ImageDownloader
:
abstract class BeagleImageDownloader {
Future<Uint8List> downloadImage(String url);
}
O método downloadImage
recebe como parâmetro a url da imagem e retorna um Future<Uint8List>
como representação da imagem baixada.
Para criar seu próprio image downloades, você precisa implementar o método downloadImage
, veja uma versão simplificada da versão padrão:
class DefaultBeagleImageDownloader implements BeagleImageDownloader {
DefaultBeagleImageDownloader({
@required this.httpClient,
}) : assert(httpClient != null);
final HttpClient httpClient;
@override
Future<Uint8List> downloadImage(String url) async {
final request = BeagleRequest(url);
final response = await httpClient.sendRequest(request);
if (response.status != HttpStatus.ok) {
throw Exception('HTTP request failed, statusCode: $response.status, $url');
}
final bytes = response.bodyBytes;
if (bytes.lengthInBytes == 0) {
throw Exception('Image is an empty file: $url');
}
return bytes;
}
}
Para usaro o ImageDownloader, apenas passe para a propriedade equivalente no BeagleService. Veja:
final beagleService = BeagleService(
imageDownloader: MyImageDownloader(),
// ...
);
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.