Как кэшировать изображения из Firebase во Flutter? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь получить доступ к изображениям в 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 приложение за короткое время сломалось.

Спасибо за любые указатели в правильном направлении !

1 Ответ

1 голос
/ 27 мая 2020

Эта проблема фактически связана с errorWidget, как показано в проблеме здесь . Код работает, если виджет ошибки закомментирован в CachedNetworkImage .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...