Я пытаюсь получить доступ к изображениям в Firebase Storage и кэшировать их локально на устройстве.
Моя текущая попытка использует flutter_cache_manager . В документации указано:
Наиболее распространенной файловой службой будет [HttpFileService], однако можно также сделать что-то более специализированное. Например, вы можете получать файлы из других приложений или из локального хранилища.
class HttpFileService implements FileService {
http.Client _httpClient;
HttpFileService({http.Client httpClient}) {
_httpClient = httpClient ?? http.Client();
}
@override
Future<FileServiceResponse> get(String url,
{Map<String, String> headers = const {}}) async {
final req = http.Request('GET', Uri.parse(url));
req.headers.addAll(headers);
final httpResponse = await _httpClient.send(req);
return HttpGetResponse(httpResponse);
}
}
Я попытался расширить этот класс для обработки URL-адреса для Firebase
class FirebaseHttpFileService extends HttpFileService {
@override
Future<FileServiceResponse> get(String url, {Map<String, String> headers = const {}}) async {
var ref = FirebaseStorage.instance.ref().child(url);
var _url = await ref.getDownloadURL() as String;
return super.get(_url);
}
}
И расширьте BaseCacheManager, используя шаблон из репозитория GitHub , заменив файловую службу моей новой.
class FirebaseCacheManager extends BaseCacheManager {
static const key = "firebaseCache";
static FirebaseCacheManager _instance;
factory FirebaseCacheManager() {
if (_instance == null) {
_instance = new FirebaseCacheManager._();
}
return _instance;
}
FirebaseCacheManager._() : super(key,
maxAgeCacheObject: Duration(days: 7),
maxNrOfCacheObjects: 20,
fileService: FirebaseHttpFileService());
Future<String> getFilePath() async {
var directory = await getTemporaryDirectory();
return p.join(directory.path, key);
}
}
Но я получаю следующую ошибку:
setState() called after dispose(): _ImageState#50d41(lifecycle state: defunct, not mounted, stream: ImageStream#ac6d5(MultiFrameImageStreamCompleter#0c956, [2448×3264] @ 1.0x, 3 listeners), pixels: null, loadingProgress: null, frameNumber: null, wasSynchronouslyLoaded: false)
Я могу обработать URL-адрес, прежде чем пытаться получить файл, но это напрасно тратит время. Я также пробовал использовать другие пакеты, такие как Flutter Cache Image , но, похоже, sh приложение за короткое время сломалось.
Спасибо за любые указатели в правильном направлении !