Minimal example:
import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html_table/flutter_html_table.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('table with img', (tester) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Html(
data:
'<table><tr><td><img src="https://example.com/img.png"></td></tr></table>',
extensions: [const TableHtmlExtension()],
),
),
),
);
});
}
With flutter 3.41.0 and above this fails with:
══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following assertion was thrown during performLayout():
RenderBox.size accessed in RenderSemanticsAnnotations.computeDryBaseline. The computeDryBaseline
method must not access the RenderBox's own size, or the size of its child, because it's established
in performLayout or performResize using different BoxConstraints.
'package:flutter/src/rendering/box.dart':
Failed assertion: line 2292 pos 11: 'renderBoxDoingDryBaseline == null'
Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
https://github.com/flutter/flutter/issues/new?template=02_bug.yml
The relevant error-causing widget was:
Text
Text:file:///home/dennis.loose@canonical.com/.pub-cache/hosted/pub.dev/flutter_html-3.0.0/lib/src/css_box_widget.dart:109:17
When the exception was thrown, this was the stack:
#2 RenderBox.size.<anonymous closure> (package:flutter/src/rendering/box.dart:2292:11)
#3 RenderBox.size (package:flutter/src/rendering/box.dart:2302:6)
#4 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:62)
#5 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#6 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#7 RenderInlineChildrenContainerDefaults._layoutChild (package:flutter/src/rendering/paragraph.dart:156:30)
#8 RenderInlineChildrenContainerDefaults.layoutInlineChildren (package:flutter/src/rendering/paragraph.dart:200:9)
#9 RenderParagraph.performLayout (package:flutter/src/rendering/paragraph.dart:910:30)
#10 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#11 RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:262:12)
#12 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#13 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#14 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#15 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#16 RenderCSSBox._computeSize (package:flutter_html/src/css_box_widget.dart:548:39)
#17 RenderCSSBox.performLayout (package:flutter_html/src/css_box_widget.dart:584:19)
#18 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#19 _RenderScaledInlineWidget.performLayout (package:flutter/src/widgets/widget_span.dart:417:11)
#20 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#21 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#22 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#23 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#24 RenderInlineChildrenContainerDefaults._layoutChild (package:flutter/src/rendering/paragraph.dart:156:30)
#25 RenderInlineChildrenContainerDefaults.layoutInlineChildren (package:flutter/src/rendering/paragraph.dart:200:9)
#26 RenderParagraph.performLayout (package:flutter/src/rendering/paragraph.dart:910:30)
#27 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#28 RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:262:12)
#29 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#30 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#31 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#32 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#33 RenderCSSBox._computeSize (package:flutter_html/src/css_box_widget.dart:548:39)
#34 RenderCSSBox.performLayout (package:flutter_html/src/css_box_widget.dart:584:19)
#35 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#36 RenderPositionedBox.performLayout (package:flutter/src/rendering/shifted_box.dart:484:14)
#37 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#38 RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:296:14)
#39 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#40 RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:262:12)
#41 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#42 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#43 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#44 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#45 RenderCSSBox._computeSize (package:flutter_html/src/css_box_widget.dart:548:39)
#46 RenderCSSBox.performLayout (package:flutter_html/src/css_box_widget.dart:584:19)
#47 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#48 RenderLayoutGrid.performLayout (package:flutter_layout_grid/src/rendering/layout_grid.dart:368:15)
#49 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#50 _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:449:14)
#51 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#52 RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:262:12)
#53 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#54 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#55 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#56 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#57 RenderCSSBox._computeSize (package:flutter_html/src/css_box_widget.dart:548:39)
#58 RenderCSSBox.performLayout (package:flutter_html/src/css_box_widget.dart:584:19)
#59 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#60 _RenderScaledInlineWidget.performLayout (package:flutter/src/widgets/widget_span.dart:417:11)
#61 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#62 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#63 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#64 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#65 RenderInlineChildrenContainerDefaults._layoutChild (package:flutter/src/rendering/paragraph.dart:156:30)
#66 RenderInlineChildrenContainerDefaults.layoutInlineChildren (package:flutter/src/rendering/paragraph.dart:200:9)
#67 RenderParagraph.performLayout (package:flutter/src/rendering/paragraph.dart:910:30)
#68 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#69 RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:262:12)
#70 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#71 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#72 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#73 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#74 RenderCSSBox._computeSize (package:flutter_html/src/css_box_widget.dart:548:39)
#75 RenderCSSBox.performLayout (package:flutter_html/src/css_box_widget.dart:584:19)
#76 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#77 _RenderScaledInlineWidget.performLayout (package:flutter/src/widgets/widget_span.dart:417:11)
#78 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#79 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#80 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#81 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#82 RenderInlineChildrenContainerDefaults._layoutChild (package:flutter/src/rendering/paragraph.dart:156:30)
#83 RenderInlineChildrenContainerDefaults.layoutInlineChildren (package:flutter/src/rendering/paragraph.dart:200:9)
#84 RenderParagraph.performLayout (package:flutter/src/rendering/paragraph.dart:910:30)
#85 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#86 RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:262:12)
#87 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#88 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#89 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#90 ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
#91 RenderCSSBox._computeSize (package:flutter_html/src/css_box_widget.dart:548:39)
#92 RenderCSSBox.performLayout (package:flutter_html/src/css_box_widget.dart:584:19)
#93 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#94 MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:180:12)
#95 _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1111:7)
#96 MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:246:7)
#97 RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:417:14)
#98 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#99 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#100 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#101 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#102 _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1549:11)
#103 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#104 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#105 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#106 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#107 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#108 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#109 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#110 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#111 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#112 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#113 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#114 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#115 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#116 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#117 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#118 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#119 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#120 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#121 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#122 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#123 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#124 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#125 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#126 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#127 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#128 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#129 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#130 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#131 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#132 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#133 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#134 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#135 RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3923:13)
#136 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#137 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#138 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#139 _RenderTheaterMixin.layoutChild (package:flutter/src/widgets/overlay.dart:1084:13)
#140 _RenderTheater.performLayout (package:flutter/src/widgets/overlay.dart:1429:9)
#141 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#142 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#143 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#144 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#145 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#146 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#147 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#148 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#149 RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:574:11)
#150 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#151 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#152 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#153 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#154 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#155 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#156 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#157 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#158 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#159 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#160 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#161 RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:118:18)
#162 RenderObject.layout (package:flutter/src/rendering/object.dart:2768:7)
#163 RenderView.performLayout (package:flutter/src/rendering/view.dart:292:12)
#164 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2616:7)
#165 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1174:18)
#166 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1187:15)
#167 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:2133:27)
#168 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5)
#169 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1430:15)
#170 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1345:9)
#171 AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:1960:9)
#174 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41)
#175 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1949:27)
#176 WidgetTester.pumpWidget.<anonymous closure> (package:flutter_test/src/widget_tester.dart:598:22)
#179 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:74:41)
#180 WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:595:27)
#181 main.<anonymous closure> (file:///home/dennis.loose@canonical.com/tmp/flutter_html_test/test/widget_test.dart:8:18)
#182 testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:192:29)
<asynchronous suspension>
#183 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1682:5)
<asynchronous suspension>
<asynchronous suspension>
(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace)
The following RenderObject was being processed when the exception was fired: RenderSemanticsAnnotations#e987a relayoutBoundary=up11 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
creator: Semantics ← _WidgetSpanParentData ← RichText ← Text ← MediaQuery ← Padding ← DecoratedBox ←
Container ← _CSSBoxRenderer ← CssBoxWidget ← _AutoScaleInlineWidget ← Semantics ← ⋯
parentData: widget: WidgetSpan#4d1fa(alignment: baseline, baseline: alphabetic, widget:
CssBoxWidget), not laid out (can use size)
constraints: BoxConstraints(0.0<=w<=0.0, 0.0<=h<=Infinity)
size: MISSING
This RenderObject had the following descendants (showing up to depth 5):
child: _RenderScaledInlineWidget#bc2cd relayoutBoundary=up12 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderCSSBox#5f965 relayoutBoundary=up13 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child 1: RenderDecoratedBox#a295d relayoutBoundary=up14 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderPadding#bcd93 relayoutBoundary=up15 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderCSSBox#f36db relayoutBoundary=up16 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
It looks like this is caused by computeDryBaseline returning null in
|
@override |
|
double? computeDryBaseline( |
|
covariant BoxConstraints constraints, TextBaseline baseline) { |
|
return null; |
|
} |
and I suspect the resulting assertion error occurs due to
this change from
flutter/flutter#171250 that landed in
3.41.0.
Minimal example:
With
flutter 3.41.0and above this fails with:It looks like this is caused by
computeDryBaselinereturningnullinflutter_html/lib/src/css_box_widget.dart
Lines 487 to 491 in c182a31
3.41.0.