Skip to content

_RenderScaledInlineWidget can throw assertion due to floating point rounding problems #130588

@moffatman

Description

@moffatman

Is there an existing issue for this?

Steps to reproduce

  1. Create a container Text.rich with width 502.5454545454545
  2. Make textScaleFactor 0.95
  3. Include in it a WidgetSpan which takes all available width

Expected results

No assertion thrown

Actual results

Assertion is thrown that child of _RenderScaledInlineWidget does not meet its constraints. That's because of floating point rounding error.

  ( 502.5454545454545 / 0.95 ) * 0.95
=   528.9952153110048          * 0.95
=   502.54545454545456

Code sample

Code sample
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class MyAppState22 extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Center(
        child: SizedBox(
          width: 502.5454545454545,
          child: Text.rich(
            WidgetSpan(child: Row()),
            textScaleFactor: 0.95
          )
        )
      )
    );
  }
}

Screenshots or Video

No response

Logs

Logs
══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following assertion was thrown during performLayout():
_RenderScaledInlineWidget does not meet its constraints.
Constraints:
  BoxConstraints(0.0<=w<=502.5, 0.0<=h<=Infinity)
Size:
  Size(502.5, 0.0)
Constraints maxwidth callum:
  502.5454545454545
Size width callum:
  502.54545454545456
If you are not writing your own RenderBox subclass, then this is not your fault. Contact support:
https://github.com/flutter/flutter/issues/new?template=2_bug.yml

The relevant error-causing widget was:
  Text Text:file:///Users/callum/Code/chan/lib/widgets/post_row.dart:169:19

When the exception was thrown, this was the stack:
#0      RenderBox.debugAssertDoesMeetConstraints.<anonymous closure>
(package:flutter/src/rendering/box.dart:2259:9)
#1      RenderBox.debugAssertDoesMeetConstraints (package:flutter/src/rendering/box.dart:2348:6)
#2      RenderBox.size=.<anonymous closure> (package:flutter/src/rendering/box.dart:2030:7)
#3      RenderBox.size= (package:flutter/src/rendering/box.dart:2032:6)
#4      _RenderScaledInlineWidget.performLayout (package:flutter/src/widgets/widget_span.dart:387:5)
#5      RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#6      RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#7      RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#8      RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#9      RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#10     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:52:11)
#11     RenderInlineChildrenContainerDefaults._layoutChild (package:flutter/src/rendering/paragraph.dart:124:28)
#12     RenderInlineChildrenContainerDefaults.layoutInlineChildren
(package:flutter/src/rendering/paragraph.dart:156:9)
#13     RenderParagraph.performLayout (package:flutter/src/rendering/paragraph.dart:764:30)
#14     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#15     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#16     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#17     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#18     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#19     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#20     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#21     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#22     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:238:12)
#23     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#24     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#25     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:52:11)
#26     RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:868:45)
#27     RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:903:32)
#28     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#29     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#30     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:52:11)
#31     RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:868:45)
#32     RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:903:32)
#33     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#34     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#35     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#36     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#37     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#38     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:52:11)
#39     RenderStack._computeSize (package:flutter/src/rendering/stack.dart:580:43)
#40     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:607:12)
#41     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#42     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#43     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:238:12)
#44     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#45     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#46     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#47     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#48     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#49     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#50     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#51     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#52     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#53     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#54     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#55     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#56     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#57     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#58     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#59     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#60     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#61     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#62     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#63     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#64     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#65     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#66     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#67     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#68     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#69     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#70     _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:315:14)
#71     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#72     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#73     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#74     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#75     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#76     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#78     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#79     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#80     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#81     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#82     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#83     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#84     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#85     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#86     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#87     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#88     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:52:11)
#89     RenderStack._computeSize (package:flutter/src/rendering/stack.dart:580:43)
#90     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:607:12)
#91     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#92     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#93     RenderAnimatedSize.performLayout (package:flutter/src/rendering/animated_size.dart:210:12)
#94     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#95     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#97     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1431:11)
#98     RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#99     RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#100    RenderAnimatedSize.performLayout (package:flutter/src/rendering/animated_size.dart:210:12)
#101    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#102    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#103    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#104    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#105    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#106    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#107    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#108    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#109    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#110    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#111    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#112    RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:213:28)
#113    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#114    RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:534:13)
#115    RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1512:12)
#116    RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1421:20)
#117    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#118    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#119    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#120    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#121    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#122    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#123    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#124    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#125    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#126    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#127    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#128    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#129    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#130    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#131    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#132    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#133    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#134    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#135    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#136    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#137    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#138    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#139    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#140    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#141    RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:554:11)
#142    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#143    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#144    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#145    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#146    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#147    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#148    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#149    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#150    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#151    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#152    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#153    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#154    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#155    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#156    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#157    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#158    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#159    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#160    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#161    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#162    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#163    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#164    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#165    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#166    RenderObject.layout (package:flutter/src/rendering/object.dart:2493:7)
#167    RenderBox.layout (package:flutter/src/rendering/box.dart:2384:11)
#168    ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:52:11)
#169    RenderStack._computeSize (package:flutter/src/rendering/stack.dart:580:43)
#170    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:607:12)
#171    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2332:7)
#172    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1013:18)
#173    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:494:19)
#174    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:918:13)
#175    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:360:5)
#176    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1300:15)
#177    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1230:9)
#178    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1086:5)
#182    _invoke (dart:ui/hooks.dart:172:10)
#183    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:401:5)
#184    _drawFrame (dart:ui/hooks.dart:140:31)
(elided 3 frames from dart:async)

The following RenderObject was being processed when the exception was fired: _RenderScaledInlineWidget#07718
relayoutBoundary=up33 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
  creator: _AutoScaleInlineWidget ← Semantics ← _WidgetSpanParentData ← RichText ← Text ← Listener ←
    ConditionalOnTapUp ← IgnorePointer ← Padding ← Builder ←
    _InheritedProviderScope<PostSpanZoneData?> ← ChangeNotifierProvider<PostSpanZoneData> ← ⋯
  parentData: <none> (can use size)
  constraints: BoxConstraints(0.0<=w<=502.5, 0.0<=h<=Infinity)
  size: Size(502.5, 0.0)
This RenderObject had the following child:
    child: RenderConstrainedBox#79fbf relayoutBoundary=up34 NEEDS-PAINT
════════════════════════════════════════════════════════════════════════════════════════════════════

Flutter Doctor output

Doctor output
[!] Flutter (Channel master, 3.13.0-3.0.pre.21, on macOS 13.4.1 22F82
    darwin-arm64, locale en-CA)
    • Flutter version 3.13.0-3.0.pre.21 on channel master at
      /Users/callum/Code/flutter
    ! Upstream repository https://github.com/moffatman/flutter.git is not a
      standard remote.
      Set environment variable "FLUTTER_GIT_URL" to
      https://github.com/moffatman/flutter.git to dismiss this error.
    • Framework revision 40ebe3f5b7 (2 days ago), 2023-07-12 11:14:00 -0400
    • Engine revision d68ea304ee
    • Dart version 3.1.0 (build 3.1.0-300.0.dev)
    • DevTools version 2.25.0
    • If those were intentional, you can disregard the above warnings; however
      it is recommended to use "git" directly to perform update checks and
      upgrades.

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /Users/callum/Library/Android/sdk
    • Platform android-33, build-tools 33.0.0
    • Java binary at: /Applications/Android
      Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build
      17.0.6+0-17.0.6b802.4-9586694)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 14E300c
    • CocoaPods version 1.12.1

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2022.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build
      17.0.6+0-17.0.6b802.4-9586694)

[✓] VS Code (version 1.79.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.68.0

[✓] Connected device (2 available)
    • macOS (desktop) • macos  • darwin-arm64   • macOS 13.4.1 22F82
      darwin-arm64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 114.0.5735.198

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 1 category.

Metadata

Metadata

Labels

frameworkflutter/packages/flutter repository. See also f: labels.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions