Skip to content

palette_generator Bad state: Future already completed #22754

Description

@afnx

I'm working with a package which is called palette_generator. I see an error when I run my app with a few line codes to use the package. I thought that the error might have caused by my code, but I couldn't figure it out. Finally, I tried to edit the source code of this package. Then, it worked without any error. However, I am not sure that the solution that I found is consistent. I'd like to share the issue and my solution in order to help other people and contribute the package.

The Issue

The error appears when I try to call the following function inside initState(). The function is the same with the one which is shown as an example in its documentation:

PaletteGenerator _paletteGenerator;

void initState() {
    super.initState();
    _updatePaletteGenerator(region);
}

Future<void> _updatePaletteGenerator(Rect newRegion) async {
    paletteGenerator = await PaletteGenerator.fromImageProvider(
      widget.image,
      size: widget.imageSize,
      region: newRegion,
      maximumColorCount: 20,
    );
    setState(() {});
}

The error looks this:

flutter: ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
flutter: The following StateError was thrown by an image listener:
flutter: Bad state: Future already completed
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #1      PaletteGenerator.fromImageProvider.imageListener (package:palette_generator/palette_generator.dart:188:22)
flutter: #2      ImageStreamCompleter.setImage (package:flutter/src/painting/image_stream.dart:282:17)
flutter: #3      MultiFrameImageStreamCompleter._emitFrame (package:flutter/src/painting/image_stream.dart:519:5)
flutter: #4      MultiFrameImageStreamCompleter._decodeNextFrameAndSchedule (package:flutter/src/painting/image_stream.dart:512:7)
flutter: <asynchronous suspension>
flutter: #5      MultiFrameImageStreamCompleter.addListener (package:flutter/src/painting/image_stream.dart:528:7)
flutter: #6      ImageStream.addListener (package:flutter/src/painting/image_stream.dart:156:25)
flutter: #7      PaletteGenerator.fromImageProvider (package:palette_generator/palette_generator.dart:200:12)
flutter: <asynchronous suspension>
flutter: #8      _TestScreenState._updatePaletteGenerator (package:test_app/screens/test_screen.dart:28:22)
flutter: #9      _TestScreenState.initState (package:test_app/screens/test_screen.dart:15:5)
flutter: #10     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3763:58)
flutter: #11     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #12     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #13     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #14     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #16     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #18     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #19     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #20     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #22     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #23     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #24     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #25     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #26     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #28     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4771:32)
flutter: #29     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #30     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #32     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #33     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #34     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #35     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #36     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #37     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #38     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #40     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #41     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #42     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #43     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #44     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #45     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #46     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #47     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #48     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #49     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #50     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #51     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #52     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #53     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #54     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #55     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #56     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #57     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #58     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #59     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #60     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #61     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #62     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #63     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #64     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #65     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #66     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #67     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #69     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #70     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #71     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #72     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #73     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #74     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #75     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #76     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #77     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #78     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #79     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #80     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #81     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #82     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #83     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #84     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #85     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #86     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #87     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #88     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #89     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #90     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #91     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #92     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #93     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #94     Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #95     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #96     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #97     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #98     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #99     Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #100    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #101    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #102    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #103    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #104    Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #105    Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #106    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4666:14)
flutter: #107    Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #108    Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #109    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #110    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #111    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #112    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #113    Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #114    Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #115    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #116    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #117    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #118    StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #119    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #120    Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #121    Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #122    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #123    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #124    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3634:5)
flutter: #125    StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3781:11)
flutter: #126    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3629:5)
flutter: #127    Element.inflateWidget (package:flutter/src/widgets/framework.dart:2919:14)
flutter: #128    Element.updateChild (package:flutter/src/widgets/framework.dart:2722:12)
flutter: #129    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4449:32)
flutter: #130    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4781:17)
flutter: #131    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #132    _TheatreElement.update (package:flutter/src/widgets/overlay.dart:507:16)
flutter: #133    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #134    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #135    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #136    StatefulElement.update (package:flutter/src/widgets/framework.dart:3811:5)
flutter: #137    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #138    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #139    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #140    ProxyElement.update (package:flutter/src/widgets/framework.dart:3921:5)
flutter: #141    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #142    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4673:14)
flutter: #143    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #144    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #145    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #146    StatefulElement.update (package:flutter/src/widgets/framework.dart:3811:5)
flutter: #147    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #148    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4673:14)
flutter: #149    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #150    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4673:14)
flutter: #151    Element.updateChild (package:flutter/src/widgets/framework.dart:2711:15)
flutter: #152    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3665:16)
flutter: #153    Element.rebuild (package:flutter/src/widgets/framework.dart:3507:5)
flutter: #154    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2255:33)
flutter: #155    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:653:20)
flutter: #156    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208:5)
flutter: #157    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
flutter: #158    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)
flutter: #159    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5)
flutter: #160    _invoke (dart:ui/hooks.dart:128:13)
flutter: #161    _drawFrame (dart:ui/hooks.dart:117:3)
flutter: (elided one frame from package dart:async)
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

The Solution

I replaced this code in package:palette_generator/palette_generator.dart:188:22:

imageCompleter.complete(info.image);

With this:

if (!imageCompleter.isCompleted) {
    imageCompleter.complete(info.image);
}

Activity

  1. jonahwilliams commented on Oct 6, 2018

    @jonahwilliams
    Contributor
  2. self-assigned this
    on Oct 6, 2018
  3. gspencergoog commented on Oct 6, 2018

    @gspencergoog
    Contributor

    Thanks @afnx! That will work, but really we just need to unregister the listener so it doesn't get called anymore once the completer is done. I created a PR with that fix in it: flutter/packages#5

  4. MohdLucky commented on Oct 17, 2018

    @MohdLucky
  5. gspencergoog commented on Oct 17, 2018

    @gspencergoog
    Contributor

    @MohdLucky, sorry, but your comment doesn't appear to have anything to do with the PaletteGenertor issue here.

    Can you please create a new issue with more information? (I'm going to hide your comment here so it doesn't clutter up this issue.)

  6. zoechi commented on Dec 11, 2018

    @zoechi
    Contributor

    The PR was merged.
    @afnx did this fix your issue?

  7. gspencergoog commented on Dec 11, 2018

    @gspencergoog
    Contributor

    Sorry, I meant to close this. @afnx, please comment here and/or open a new issue if it doesn't solve your issue.

  8. jitheshkramesh commented on Jun 2, 2019

    @jitheshkramesh

    Hi,

    While adding palette_generator reference, I am getting an error like this.
    Please suggest.

    Compiler message:
    file:///C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/palette_generator-0.1.1/lib/palette_generator.dart:188:29: Error: The argument type 'void Function(ImageInfo,
    bool)' can't be assigned to the parameter type 'ImageStreamListener'.

    • 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/src/flutter/packages/flutter/lib/src/painting/image_stream.dart').
    • 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/src/flutter/packages/flutter/lib/src/painting/image_stream.dart').
      Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
      stream.removeListener(imageListener);
      ^
      file:///C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/palette_generator-0.1.1/lib/palette_generator.dart:194:31: Error: The argument type 'void Function(ImageInfo,
      bool)' can't be assigned to the parameter type 'ImageStreamListener'.
    • 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/src/flutter/packages/flutter/lib/src/painting/image_stream.dart').
    • 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/src/flutter/packages/flutter/lib/src/painting/image_stream.dart').
      Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
      stream.removeListener(imageListener);
      ^
      file:///C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/palette_generator-0.1.1/lib/palette_generator.dart:201:24: Error: The argument type 'void Function(ImageInfo,
      bool)' can't be assigned to the parameter type 'ImageStreamListener'.
    • 'ImageInfo' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/src/flutter/packages/flutter/lib/src/painting/image_stream.dart').
    • 'ImageStreamListener' is from 'package:flutter/src/painting/image_stream.dart' ('file:///C:/src/flutter/packages/flutter/lib/src/painting/image_stream.dart').
      Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
      stream.addListener(imageListener);
  9. lucasjinreal commented on Jun 21, 2019

    @lucasjinreal

    @jimbeveridge @jitheshkramesh Flutter update its api.

    You should change that package calling style. But as for how, I do not know.

    I am also got same error:

    Try changing the type of the parameter, or casting the argument to 'ImageStreamListener'.
          stream.removeListener(imageListener);
    
  10. github-actions commented on Aug 29, 2021

    @github-actions

    This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

  11. locked as resolved and limited conversation to collaborators on Aug 29, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

p: palette_generatorPalette generator packagepackageflutter/packages repository. See also p: labels.waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions