Skip to content
This repository has been archived by the owner on Jul 6, 2020. It is now read-only.

Exception when calling setState on loadedCallback in Hero widget #84

Open
erf opened this issue Mar 8, 2019 · 16 comments
Open

Exception when calling setState on loadedCallback in Hero widget #84

erf opened this issue Mar 8, 2019 · 16 comments

Comments

@erf
Copy link

erf commented Mar 8, 2019

I have a StatefulWidget with a TransitionToImage(image: AdvancedNetworkImage....

I get an exception when i call setState inside TransitionToImage.loadedCallback.

Log:

Performing hot restart...
Syncing files to device iPhone XR...
Restarted application in 2,937ms.
flutter: ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
flutter: The following assertion was thrown when reporting an error to an image listener:
flutter: setState() or markNeedsBuild() called during build.
flutter: This TransitionToImage widget cannot be marked as needing to build because the framework is already
flutter: in the process of building widgets. A widget can be marked as needing to be built during the build
flutter: phase only if one of its ancestors is currently building. This exception is allowed because the
flutter: framework builds parent widgets before children, which means a dirty descendant will always be
flutter: built. Otherwise, the framework might not visit this widget during this build phase.
flutter: The widget on which setState() or markNeedsBuild() was called was:
flutter:   TransitionToImage(dependencies: [MediaQuery, _LocalizationsScope-[GlobalKey#83f64],
flutter:   Directionality], state: _TransitionToImageState#1a37c(ticker inactive))
flutter: The widget which was currently being built when the offending call was made was:
flutter:   PlaceholderImage
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:3497:11)
flutter: #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:3523:6)
flutter: #2      State.setState (package:flutter/src/widgets/framework.dart:1138:14)
flutter: #3      _TransitionToImageState._catchBadImage (package:flutter_advanced_networkimage/src/transition_to_image.dart:335:5)
flutter: #4      ImageStreamCompleter.reportError (package:flutter/src/painting/image_stream.dart:404:24)
flutter: #5      ImageStreamCompleter.addListener (package:flutter/src/painting/image_stream.dart:286:9)
flutter: #6      MultiFrameImageStreamCompleter.addListener (package:flutter/src/painting/image_stream.dart:604:11)
flutter: #7      ImageStream.addListener (package:flutter/src/painting/image_stream.dart:160:25)
flutter: #8      _TransitionToImageState._getImage (package:flutter_advanced_networkimage/src/transition_to_image.dart:319:20)
flutter: #9      _TransitionToImageState.didChangeDependencies (package:flutter_advanced_networkimage/src/transition_to_image.dart:227:5)
flutter: #10     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3862:12)
flutter: #11     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
flutter: #12     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
flutter: #13     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
flutter: #14     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #15     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #16     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
flutter: #17     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
flutter: #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
flutter: #19     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
flutter: #20     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
flutter: #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
flutter: #22     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
flutter: #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #24     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #25     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
flutter: #26     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
flutter: #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
flutter: #28     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
flutter: #29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #30     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #31     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #32     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #33     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4601:32)
flutter: #34     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4992:17)
flutter: #35     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #37     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #38     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #39     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #40     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #41     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #42     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #45     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #46     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #47     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #48     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #49     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #50     StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
flutter: #51     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #52     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #53     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #54     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #55     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #56     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #57     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #58     StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
flutter: #59     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #60     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #61     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #62     ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #63     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #64     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #65     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #66     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #67     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #68     SliverVariableSizeBoxAdaptorElement.updateChild (package:flutter_staggered_grid_view/src/widgets/sliver.dart:170:36)
flutter: #69     SliverVariableSizeBoxAdaptorElement.performRebuild (package:flutter_staggered_grid_view/src/widgets/sliver.dart:130:13)
flutter: #70     SliverVariableSizeBoxAdaptorElement.update (package:flutter_staggered_grid_view/src/widgets/sliver.dart:99:54)
flutter: #71     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #72     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #73     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #74     ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #75     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #76     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #77     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #78     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4601:32)
flutter: #79     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4992:17)
flutter: #80     _ViewportElement.update (package:flutter/src/widgets/viewport.dart:192:11)
flutter: #81     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #82     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #83     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #84     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #85     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #86     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #87     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #88     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #89     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #90     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #91     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #92     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #93     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #94     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #95     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #96     ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #97     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #98     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #99     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #100    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #101    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #102    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #103    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #104    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #105    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #106    StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
flutter: #107    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #108    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #109    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #110    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #111    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #112    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #113    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #114    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #115    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #116    StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
flutter: #117    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #118    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #119    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #120    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #121    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #122    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #123    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #124    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #125    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #126    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #127    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #128    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #129    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #130    ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #131    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #132    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #133    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #134    ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #135    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #136    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4601:32)
flutter: #137    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4992:17)
flutter: #138    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #139    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #140    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #141    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #142    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #143    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #144    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #145    ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #146    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #147    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #148    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #149    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #150    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #151    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #152    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #153    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #154    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #155    StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
flutter: #156    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #157    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
flutter: #158    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #159    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #160    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #161    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #162    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #163    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #164    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #165    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #166    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #167    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #168    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #169    ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #170    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #171    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #172    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #173    ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
flutter: #174    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #175    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #176    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #177    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
flutter: #178    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
flutter: #179    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
flutter: #180    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
flutter: #181    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2273:33)
flutter: #182    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:700:20)
flutter: #183    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:268:5)
flutter: #184    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:988:15)
flutter: #185    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:928:9)
flutter: #186    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:840:5)
flutter: #190    _invoke (dart:ui/hooks.dart:209:10)
flutter: #191    _drawFrame (dart:ui/hooks.dart:168:3)
flutter: (elided 3 frames from package dart:async)
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
flutter: Another exception was thrown: setState() or markNeedsBuild() called during build.
@mchome
Copy link
Owner

mchome commented Mar 9, 2019

Hi, give me a code snippet to reproduce this issue.

@erf
Copy link
Author

erf commented Mar 9, 2019

Here is a minimal example. Press the image to go to the next page, to trigger the Exception. The exception only happens when the image is wrapped in a Hero widget. If you try to comment out the setState call inside loadedCallback, everything is ok. I wanted to set a isLoaded attribute after loadedCallback was called, so i could recreate the UI with some changes.

import 'package:flutter/material.dart';

import 'package:flutter/cupertino.dart';
import 'package:flutter_advanced_networkimage/provider.dart';
import 'package:flutter_advanced_networkimage/transition.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DiscoverPage(),
    );
  }
}

class DiscoverPage extends StatefulWidget {
  DiscoverPage();

  @override
  State<StatefulWidget> createState() {
    return _DiscoverPageState();
  }
}

class _DiscoverPageState extends State<DiscoverPage> {
  var items = [1, 2, 3, 4, 5];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: items.length,
        itemBuilder: (context, index) {
          final id = items[index];
          return GestureDetector(
            onTap: () {
              Navigator.push(context,
                  MaterialPageRoute(builder: (context) => ItemDetailPage(id)));
            },
            child: ItemTile(id),
          );
        },
      ),
    );
  }
}

class ItemTile extends StatefulWidget {
  final int id;

  ItemTile(this.id);

  @override
  _ItemTileState createState() => _ItemTileState();
}

class _ItemTileState extends State<ItemTile> {
  bool _imageIsLoaded = false;

  _ItemTileState();

  @override
  Widget build(BuildContext context) {
    return Hero(
      tag: 'id-${widget.id}',
      child: TransitionToImage(
        image: AdvancedNetworkImage(
          'https://www.gstatic.com/webp/gallery/1.jpg',
        ),
        loadedCallback: () {
          setState(() {
            _imageIsLoaded = true;
          });
        },
      ),
    );
  }
}

class ItemDetailPage extends StatefulWidget {
  final int id;

  ItemDetailPage(this.id);

  @override
  _ItemDetailPageState createState() => _ItemDetailPageState();
}

class _ItemDetailPageState extends State<ItemDetailPage> {
  @override
  Widget build(BuildContext context) {
    return Hero(
      tag: 'id-${widget.id}',
      child: TransitionToImage(
        image: AdvancedNetworkImage(
          'https://www.gstatic.com/webp/gallery/1.jpg',
        ),
      ),
    );
  }
}

@mchome
Copy link
Owner

mchome commented Mar 14, 2019

Can you use loadedCallback in AdvancedNetworkImage instead?

@erf
Copy link
Author

erf commented Mar 14, 2019

Yes. This seem to work. Thank you for your efforts.

@erf erf closed this as completed Mar 14, 2019
@erf
Copy link
Author

erf commented Mar 14, 2019

I found a case where this crashes still. If i add a key, to the stateful widget, it crashes inside loadedCallback, because mounted is now false ( most of the time ).

Se example ( notice loaded does not show ):

import 'package:flutter/material.dart';

import 'package:flutter/cupertino.dart';
import 'package:flutter_advanced_networkimage/provider.dart';
import 'package:flutter_advanced_networkimage/transition.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DiscoverPage(),
    );
  }
}

class DiscoverPage extends StatefulWidget {
  DiscoverPage();

  @override
  State<StatefulWidget> createState() {
    return _DiscoverPageState();
  }
}

class _DiscoverPageState extends State<DiscoverPage> {
  var items = [1, 2, 3, 4, 5];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: items.length,
        itemBuilder: (context, index) {
          final id = items[index];
          return GestureDetector(
            onTap: () {
              Navigator.push(context,
                  MaterialPageRoute(builder: (context) => ItemDetailPage(id)));
            },
            child: ItemTile(
              id,
              key: UniqueKey(),
            ),
          );
        },
      ),
    );
  }
}

class ItemTile extends StatefulWidget {
  final int id;

  ItemTile(this.id, {Key key}) : super(key: key);

  @override
  _ItemTileState createState() => _ItemTileState();
}

class _ItemTileState extends State<ItemTile> {
  bool _imageIsLoaded = false;

  _ItemTileState();

  @override
  Widget build(BuildContext context) {
    return _imageIsLoaded
        ? Text('Loaded')
        : Hero(
            tag: 'id-${widget.id}',
            child: TransitionToImage(
              image: AdvancedNetworkImage(
                'https://www.gstatic.com/webp/gallery/1.jpg',
                loadedCallback: () {
                  print(mounted);
                  //if(mounted) {
                  setState(() {
                    _imageIsLoaded = true;
                  });
                  //}
                },
              ),
            ),
          );
  }
}

class ItemDetailPage extends StatefulWidget {
  final int id;

  ItemDetailPage(this.id);

  @override
  _ItemDetailPageState createState() => _ItemDetailPageState();
}

class _ItemDetailPageState extends State<ItemDetailPage> {
  @override
  Widget build(BuildContext context) {
    return Hero(
      tag: 'id-${widget.id}',
      child: TransitionToImage(
        image: AdvancedNetworkImage(
          'https://www.gstatic.com/webp/gallery/1.jpg',
        ),
      ),
    );
  }
}

@erf erf reopened this Mar 14, 2019
@mchome
Copy link
Owner

mchome commented Mar 15, 2019

Hmmm, i have no crashes with this example but only one Loaded widget was showed bacause of flutter's memory image cache. Try to add retryLimit: widget.id in _ItemTileState's AdvancedNetworkImage.

@erf
Copy link
Author

erf commented Mar 15, 2019

If i run the app once, and then perform a hot restart, it crashes with the following ( trying to set state when it has been disposed ).

setState() called after dispose(): _ItemTileState#82c5b(lifecycle state: defunct, not mounted)
This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback. The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().

Adding retryLimit, makes it work, but i'm not sure what it does or why setting the widget.id to it makes sense..

@mchome
Copy link
Owner

mchome commented Mar 15, 2019

Just making a different image provider hashes.

@erf
Copy link
Author

erf commented Mar 15, 2019

It feels a bit wrong to set retryLimit, just to make a different hash, when i don't care about retryLimit. Maybe passing a UniqueKey would be better? I still don't understand though why the AdvancedNetworkImage is disposed in loadedCallback.

@mchome
Copy link
Owner

mchome commented Mar 15, 2019

Umm, maybe i can add uid to make different hashes.

@override
int get hashCode => ui.hashValues(uid, url, scale, header, useDiskCache,
    retryLimit, retryDuration, retryDurationFactor, timeoutDuration);

AdvancedNetworkImage is not widget, it was _ItemTileState#82c5b disposed, and loadedCallback fired. You can add if (mounted) or remove setState.

@mchome mchome changed the title Exception when calling setState on loadedCallback Exception when calling setState on loadedCallback in Hero widget Mar 15, 2019
@erf
Copy link
Author

erf commented Mar 15, 2019

How would the uid be created?

If i add if (mounted), the Loaded text is not shown. Do you know why the _ItemTileState is disposed?

@mchome
Copy link
Owner

mchome commented Mar 15, 2019

Next version maybe?

Maybe ListBuilder fired dispose(), i do not have this problem actually.

@erf
Copy link
Author

erf commented Mar 15, 2019

What i optimally would like to happen is that loadedCallback is called after image is loaded ( whether it is cached or not ), and that i then can call setState to rebuild the UI, without having to set some retryLimit or uid variable, and optimally without having to check if it is mounted, because it should be.. i think.

As you said, you were not able to show the loaded text after image is loaded, so i think that is a problem still for you.

@chrispypatt
Copy link

chrispypatt commented Jun 14, 2019

Similar to the issue above, I have a AdvancedNetworkImage which does not use loadedCallback but instead uses an icon for loadingWidget and I get the same setState assertion only in Hero widgets (works fine with MaterialScaffold but has issues with CupertinoScaffold.

TransitionToImage(
    image: AdvancedNetworkImage(
        widget.deal.photo,
        useDiskCache: true,
            cacheRule: CacheRule(maxAge: const Duration(days: 1)),
         ),
         fit: BoxFit.cover,
         loadingWidget: Container(
             color: Colors.transparent,
             child: const Icon(Icons.local_dining, 
                 color: Colors.white,
                 size: 150.0,
              ),
           ),                    
      ),
),
> flutter: ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
flutter: The following assertion was thrown when reporting an error to an image listener:
flutter: setState() called after dispose(): _TransitionToImageState#37f4b(lifecycle state: defunct, not
flutter: mounted, ticker inactive)
flutter: This error happens if you call setState() on a State object for a widget that no longer appears in
flutter: the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error
flutter: can occur when code calls setState() from a timer or an animation callback. The preferred solution
flutter: is to cancel the timer or stop listening to the animation in the dispose() callback. Another
flutter: solution is to check the "mounted" property of this object before calling setState() to ensure the
flutter: object is still in the tree.
flutter: This error might indicate a memory leak if setState() is being called because another object is
flutter: retaining a reference to this State object after it has been removed from the tree. To avoid memory
flutter: leaks, consider breaking the reference to this object during dispose().
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      State.setState.<anonymous closure> (package:flutter/src/widgets/framework.dart:1101:9)
flutter: #1      State.setState (package:flutter/src/widgets/framework.dart:1127:6)
flutter: #2      _TransitionToImageState._catchBadImage (package:flutter_advanced_networkimage/src/transition/transition_to_image.dart:371:5)
flutter: #3      ImageStreamCompleter.reportError (package:flutter/src/painting/image_stream.dart:474:24)
flutter: #4      ImageStreamCompleter.setImage (package:flutter/src/painting/image_stream.dart:409:9)
flutter: #5      MultiFrameImageStreamCompleter._emitFrame (package:flutter/src/painting/image_stream.dart:709:5)
flutter: #6      MultiFrameImageStreamCompleter._decodeNextFrameAndSchedule (package:flutter/src/painting/image_stream.dart:694:7)
flutter: <asynchronous suspension>
flutter: #7      MultiFrameImageStreamCompleter._handleCodecReady (package:flutter/src/painting/image_stream.dart:644:7)
flutter: #17     AdvancedNetworkImage._loadAsync (package:flutter_advanced_networkimage/src/provider/flutter_advanced_networkimage.dart)
flutter: <asynchronous suspension>
flutter: #18     AdvancedNetworkImage.load (package:flutter_advanced_networkimage/src/provider/flutter_advanced_networkimage.dart:145:14)
flutter: #19     AdvancedNetworkImage.resolve.<anonymous closure>.<anonymous closure> (package:flutter_advanced_networkimage/src/provider/flutter_advanced_networkimage.dart:130:37)
flutter: #20     ImageCache.putIfAbsent (package:flutter/src/painting/image_cache.dart:160:22)
flutter: #21     AdvancedNetworkImage.resolve.<anonymous closure> (package:flutter_advanced_networkimage/src/provider/flutter_advanced_networkimage.dart:130:14)
flutter: #22     SynchronousFuture.then (package:flutter/src/foundation/synchronous_future.dart:38:29)
flutter: #23     AdvancedNetworkImage.resolve (package:flutter_advanced_networkimage/src/provider/flutter_advanced_networkimage.dart:124:30)
flutter: #24     _TransitionToImageState._getImage (package:flutter_advanced_networkimage/src/transition/transition_to_image.dart:335:35)
flutter: #25     _TransitionToImageState.didChangeDependencies (package:flutter_advanced_networkimage/src/transition/transition_to_image.dart:255:5)
flutter: #26     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3994:12)
flutter: #27     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #28     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #29     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #30     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #31     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #32     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #33     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #34     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #35     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #37     Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #38     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #39     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #40     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #41     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5124:32)
flutter: #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #44     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #46     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5124:32)
flutter: #47     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #48     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #49     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #50     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #51     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #52     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #53     Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #54     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #55     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #56     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #57     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #58     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #59     Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #60     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #61     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3996:11)
flutter: #62     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #63     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #64     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #65     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #66     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #67     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #69     Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #70     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #71     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #72     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #73     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #74     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #75     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #76     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #77     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #78     Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #79     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #80     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #81     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #82     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #83     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #84     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #85     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #86     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #87     Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #88     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #89     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3996:11)
flutter: #90     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #91     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #92     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #93     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #94     Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #95     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #96     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3996:11)
flutter: #97     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #98     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #99     Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #100    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #101    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #102    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #103    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #104    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #105    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #106    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #107    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #108    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #109    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #110    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #111    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #112    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #113    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #114    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #115    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #116    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #117    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #118    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #119    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #120    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #121    StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3996:11)
flutter: #122    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #123    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #124    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #125    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #126    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #127    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #128    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #129    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #130    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #131    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #132    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #133    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #134    StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3996:11)
flutter: #135    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #136    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #137    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #138    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #139    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #140    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #141    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #142    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #143    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #144    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #145    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #146    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #147    SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5018:14)
flutter: #148    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #149    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #150    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #151    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #152    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #153    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #154    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #155    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #156    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #157    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #158    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #159    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #160    ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4205:11)
flutter: #161    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #162    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #163    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #164    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #165    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #166    StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3996:11)
flutter: #167    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #168    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #169    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #170    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3882:16)
flutter: #171    Element.rebuild (package:flutter/src/widgets/framework.dart:3668:5)
flutter: #172    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3854:5)
flutter: #173    ComponentElement.mount (package:flutter/src/widgets/framework.dart:3849:5)
flutter: #174    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3055:14)
flutter: #175    Element.updateChild (package:flutter/src/widgets/framework.dart:2858:12)
flutter: #176    SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1181:36)
flutter: #177    SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1166:20)
flutter: #178    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2297:19)
flutter: #179    SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1159:11)
flutter: #180    RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:354:23)
flutter: #181    RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1715:58)
flutter: #182    PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:796:15)
flutter: #183    RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1715:13)
flutter: #184    RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:343:5)
flutter: #185    RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:489:5)
flutter: #186    RenderSliverList.performLayout.advance (package:flutter/src/rendering/sliver_list.dart:191:19)
flutter: #187    RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:234:19)
flutter: #188    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #189    RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:181:11)
flutter: #190    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #191    RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:406:13)
flutter: #192    RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1334:12)
flutter: #193    RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1252:20)
flutter: #194    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #195    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #196    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #197    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #198    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #199    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #200    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #201    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #202    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #203    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #204    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #205    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #206    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #207    RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:206:11)
flutter: #208    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #209    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
flutter: #210    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #211    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
flutter: #212    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #213    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
flutter: #214    RenderObject.layout (package:flutter/src/rendering/object.dart:1619:7)
flutter: #215    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
flutter: #216    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1496:7)
flutter: #217    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:765:18)
flutter: #218    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:346:19)
flutter: #219    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
flutter: #220    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:285:5)
flutter: #221    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1012:15)
flutter: #222    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:952:9)
flutter: #223    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:864:5)
flutter: #227    _invoke (dart:ui/hooks.dart:236:10)
flutter: #228    _drawFrame (dart:ui/hooks.dart:194:3)
flutter: (elided 12 frames from package dart:async and package dart:async-patch)
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

> 

@tamoyal
Copy link

tamoyal commented May 20, 2020

I have the same problem as @erf and the loadedFromDiskCacheCallback is never fired when the image is loaded from the cache. So it works fine on first load to rebuild the UI based on a state change but the second time, there is no callback to tell me the image was loaded from cache so my UI never updates

@tamoyal
Copy link

tamoyal commented May 20, 2020

Adding this works. So basically we don't get loaded callbacks when images are loaded from the memory cache

                useDiskCache: true,
                disableMemoryCache: true,

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

4 participants