/* * @Author: wangyang 1147192855@qq.com * @Date: 2022-10-22 18:18:58 * @LastEditors: wangyang 1147192855@qq.com * @LastEditTime: 2022-10-22 18:20:20 * @FilePath: \sell_ticket_app\lib\utils\img_util\NetworkImageSSL.dart * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; import 'dart:ui' as ui show instantiateImageCodec, Codec; import 'package:flutter/foundation.dart'; import 'package:flutter/painting.dart'; /// Image.network方法显示HTTPS图片时忽略证书 class NetworkImageSSL extends ImageProvider { const NetworkImageSSL(this.url, {this.scale = 1.0, this.headers}) : assert(url != null), assert(scale != null); final String url; final double scale; final Map? headers; @override Future obtainKey(ImageConfiguration configuration) { return new SynchronousFuture(this); } @override ImageStreamCompleter load(NetworkImageSSL key, DecoderCallback decode) { return MultiFrameImageStreamCompleter(codec: _loadAsync(key), scale: key.scale); } static final HttpClient _httpClient = new HttpClient() ..badCertificateCallback = ((X509Certificate cert, String host, int port) => true); Future _loadAsync(NetworkImageSSL key) async { assert(key == this); final Uri resolved = Uri.base.resolve(key.url); final HttpClientRequest request = await _httpClient.getUrl(resolved); headers?.forEach((String name, String value) { request.headers.add(name, value); }); final HttpClientResponse response = await request.close(); if (response.statusCode != HttpStatus.ok) throw new Exception( 'HTTP请求失败,状态码: ${response.statusCode}, $resolved'); final Uint8List bytes = await consolidateHttpClientResponseBytes(response); if (bytes.lengthInBytes == 0) throw new Exception('NetworkImageSSL是一个空文件: $resolved'); return await ui.instantiateImageCodec(bytes); } @override bool operator ==(dynamic other) { if (other.runtimeType != runtimeType) return false; final NetworkImageSSL typedOther = other; return url == typedOther.url && scale == typedOther.scale; } @override int get hashCode => hashValues(url, scale); @override String toString() => '$runtimeType("$url", scale: $scale)'; }