Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

Flutter/Flutter Study

[Flutter] Bad state: Future already completed

방피터 2022. 11. 10. 09:54

나같은 경우 네트워크에서 로드하는 이미지의 사이즈를 이미 알아내서 위젯을 그릴려고 completer를 사용했는데 가끔씩 이미지 로드에 실패하고 Bad state: Future already completed라는 에러가 뜨더라고;;;;

코드는 아래와 같은데 어떤 이유에서건 imageProfiver listener가 여러번 수행되서 그런 거 같아.

...
CachedNetworkImage(
  imageUrl: imageUrl,
  width: 50,
  imageBuilder: (context, imageProvider) {
    Completer<ui.Image> completer = Completer<ui.Image>();
    imageProvider
        .resolve(const ImageConfiguration())
        .addListener(ImageStreamListener((ImageInfo info, bool _) {
      completer.complete(info.image);
    }));
    return FutureBuilder<ui.Image>(
      future: completer.future,
      builder: (context, snapshot) {
...

그걸 방지하려면 아래와 같이 completer가 complete 되지 않았을 때만 complete을 수행하도록 변경하면 에러가 말끔하게 사라짐!

CachedNetworkImage(
  imageUrl: imageUrl,
  width: 50,
  imageBuilder: (context, imageProvider) {
    Completer<ui.Image> completer = Completer<ui.Image>();
    imageProvider
        .resolve(const ImageConfiguration())
        .addListener(ImageStreamListener((ImageInfo info, bool _) {
      //completer가 complete 되지 않았을 때만 complete!
      if (completer.isCompleted == false) {
        completer.complete(info.image);
      }
    }));
    return FutureBuilder<ui.Image>(
      future: completer.future,
      builder: (context, snapshot) {
        if (snapshot.hasData) {

수고!

반응형