flutter_advanced_networkimage
flutter_advanced_networkimage copied to clipboard
Exception when calling setState on loadedCallback in Hero widget
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.
Hi, give me a code snippet to reproduce this issue.
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',
),
),
);
}
}
Can you use loadedCallback in AdvancedNetworkImage instead?
Yes. This seem to work. Thank you for your efforts.
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',
),
),
);
}
}
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.
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..
Just making a different image provider hashes.
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.
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.
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?
Next version maybe?
Maybe ListBuilder fired dispose(), i do not have this problem actually.
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.
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: ════════════════════════════════════════════════════════════════════════════════════════════════════
>
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
Adding this works. So basically we don't get loaded callbacks when images are loaded from the memory cache
useDiskCache: true,
disableMemoryCache: true,