Skip to content

[BUG] <img> inside a <table> causes assertion error in flutter >=3.41.0 #1510

Description

@d-loose

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions