From a9da05a7fe35da43affa168736253df373d5ec6a Mon Sep 17 00:00:00 2001 From: realth000 Date: Fri, 30 Aug 2024 01:52:18 +0800 Subject: [PATCH] fix(*): Fix failed to load br compressed image from web request Some contents (images) in web response is compressed in br format and dio has no support of that format so the response data is considered as invalid image data. This commit added a package to decompress response data when is in br format. --- CHANGELOG.md | 1 + .../cache/repository/image_cache_repository.dart | 7 +++---- .../image_cache_provider.dart | 2 +- .../net_client_provider/net_client_provider.dart | 5 +++++ .../cached_image/cached_image_provider.dart | 2 +- pubspec.lock | 16 ++++++++++++++++ pubspec.yaml | 1 + 7 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d9ed94f..b9cf9a7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - app:修复先前升级flutter版本导致的默认配色问题,现在使用默认的蓝色作为色调。 - app:修正各类边距值不是Material 3取值的问题。 - app:修复一些情况下,网络连接报错但UI没有更新的问题。 +- app:修复部分图片无法加载的问题。 - 翻译:修复部分错误翻译。 - 帖子:修复部分签名档存在样式溢出的用户的所在楼层无法回复和评分的问题。 - 帖子:修复帖子评分中头像无法加载时不显示且不断重试的问题。 diff --git a/lib/features/cache/repository/image_cache_repository.dart b/lib/features/cache/repository/image_cache_repository.dart index 94fd0408..dd7325f8 100644 --- a/lib/features/cache/repository/image_cache_repository.dart +++ b/lib/features/cache/repository/image_cache_repository.dart @@ -74,10 +74,9 @@ final class ImageCacheRepository with LoggerMixin { handle(err); throw err; } - final imageData = respEither.unwrap().data as List; - await _imageCacheProvider.updateCache(url, imageData); - _controller - .add(ImageCacheSuccessResponse(url, Uint8List.fromList(imageData))); + final imageData = respEither.unwrap().data as Uint8List; + await _imageCacheProvider.updateCache(url, Uint8List.fromList(imageData)); + _controller.add(ImageCacheSuccessResponse(url, imageData)); } catch (e) { _controller.add(ImageCacheFailedResponse(url)); } diff --git a/lib/shared/providers/image_cache_provider/image_cache_provider.dart b/lib/shared/providers/image_cache_provider/image_cache_provider.dart index 4074f6b1..e66eec8d 100644 --- a/lib/shared/providers/image_cache_provider/image_cache_provider.dart +++ b/lib/shared/providers/image_cache_provider/image_cache_provider.dart @@ -99,7 +99,7 @@ final class ImageCacheProvider with LoggerMixin { /// Update image cached file. /// /// Update cache file and info in database. - Future updateCache(String imageUrl, List imageData) async { + Future updateCache(String imageUrl, Uint8List imageData) async { final fileName = imageUrl.fileNameV5(); // Update image cache info to database. diff --git a/lib/shared/providers/net_client_provider/net_client_provider.dart b/lib/shared/providers/net_client_provider/net_client_provider.dart index 2354536c..bcfda036 100644 --- a/lib/shared/providers/net_client_provider/net_client_provider.dart +++ b/lib/shared/providers/net_client_provider/net_client_provider.dart @@ -3,6 +3,7 @@ import 'dart:io' if (dart.libaray.js) 'package:web/web.dart'; import 'package:cookie_jar/cookie_jar.dart'; import 'package:dio/dio.dart'; import 'package:dio/io.dart'; +import 'package:dio_brotli_transformer/dio_brotli_transformer.dart'; import 'package:dio_cookie_manager/dio_cookie_manager.dart'; import 'package:tsdm_client/exceptions/exceptions.dart'; import 'package:tsdm_client/features/settings/repositories/settings_repository.dart'; @@ -95,6 +96,8 @@ final class NetClientProvider with LoggerMixin { }, ); d.interceptors.add(_ErrorHandler()); + // decode br content-type. + d.transformer = DioBrotliTransformer(); } return NetClientProvider._(d); @@ -104,6 +107,8 @@ final class NetClientProvider with LoggerMixin { factory NetClientProvider.buildNoCookie({Dio? dio}) { final d = dio ?? getIt.get().buildDefaultDio(); d.interceptors.add(_ErrorHandler()); + // decode br content-type. + d.transformer = DioBrotliTransformer(); return NetClientProvider._(d); } diff --git a/lib/widgets/cached_image/cached_image_provider.dart b/lib/widgets/cached_image/cached_image_provider.dart index 3d978d99..02529392 100644 --- a/lib/widgets/cached_image/cached_image_provider.dart +++ b/lib/widgets/cached_image/cached_image_provider.dart @@ -126,7 +126,7 @@ final class CachedImageProvider extends ImageProvider error('failed to get image from $imageUrl, code=${resp.statusCode}'); return Uint8List(0); } - final imageData = resp.data as List; + final imageData = resp.data as Uint8List; // Make cache. await getIt.get().updateCache(imageUrl, imageData); diff --git a/pubspec.lock b/pubspec.lock index ae8ade19..f86bdbf9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -86,6 +86,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + brotli: + dependency: transitive + description: + name: brotli + sha256: "7f891558ed779aab2bed874f0a36b8123f9ff3f19cf6efbee89e18ed294945ae" + url: "https://pub.dev" + source: hosted + version: "0.6.0" build: dependency: transitive description: @@ -327,6 +335,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.6.0" + dio_brotli_transformer: + dependency: "direct main" + description: + name: dio_brotli_transformer + sha256: "2ceeaa997a6c2faeda7e1ad1765e87316c9be853fb9892fd0c80c71ca6788e92" + url: "https://pub.dev" + source: hosted + version: "2.0.0" dio_cookie_manager: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 20081996..89e373c9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: dart_mappable: 4.2.2 device_info_plus: ^10.1.2 dio: ^5.6.0 + dio_brotli_transformer: ^2.0.0 dio_cookie_manager: ^3.1.1 drift: ^2.19.1+1 # For drift