xterm.dart icon indicating copy to clipboard operation
xterm.dart copied to clipboard

Uncaught error if TerminalView is placed inside a Column widget

Open pmellati opened this issue 2 years ago • 1 comments

Running as a macOS app, I'm getting the following error:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following UnsupportedError was thrown building LayoutBuilder:
Unsupported operation: Infinity or NaN toInt

The relevant error-causing widget was:
  LayoutBuilder
  LayoutBuilder:file:///Users/pouriamellati/.pub-cache/hosted/pub.dartlang.org/xterm-2.6.0/lib/frontend/terminal_view.dart:187:16

When the exception was thrown, this was the stack:
#0      double.toInt (dart:core-patch/double.dart)
#1      double.floor (dart:core-patch/double.dart:201:34)
#2      _TerminalViewState.updateTerminalSize (package:xterm/frontend/terminal_view.dart:393:58)
#3      _TerminalViewState.onWidgetSize (package:xterm/frontend/terminal_view.dart:382:5)
#4      _TerminalViewState.build.<anonymous closure> (package:xterm/frontend/terminal_view.dart:188:11)
#5      _LayoutBuilderElement._layout.layoutCallback (package:flutter/src/widgets/layout_builder.dart:122:31)
#6      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2600:19)
#7      _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:156:12)
#8      RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1997:59)
#9      PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:918:15)
#10     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1997:14)
#11     RenderConstrainedLayoutBuilder.rebuildIfNecessary (package:flutter/src/widgets/layout_builder.dart:230:7)
#12     _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:319:5)
#13     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#14     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#15     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#16     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#17     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#18     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#19     RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:829:43)
#20     RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:931:32)
#21     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#22     RenderPositionedBox.performLayout (package:flutter/src/rendering/shifted_box.dart:437:14)
#23     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#24     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:171:12)
#25     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1005:7)
#26     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:240:7)
#27     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:403:14)
#28     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#29     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#30     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#31     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#32     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1376:11)
#33     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#34     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#35     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#36     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#37     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#38     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#39     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#40     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#41     RenderStack._computeSize (package:flutter/src/rendering/stack.dart:570:43)
#42     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:597:12)
#43     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#44     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#45     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#46     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#47     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#48     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#49     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#50     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#51     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#52     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#53     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#54     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#55     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#56     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#57     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3430:13)
#58     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#59     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#60     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#61     _RenderTheatre.performLayout (package:flutter/src/widgets/overlay.dart:751:15)
#62     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#63     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#64     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#65     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#66     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#67     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#68     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#69     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#70     RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:545:11)
#71     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#72     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#74     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#75     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#76     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:1887:7)
#80     RenderView.performLayout (package:flutter/src/rendering/view.dart:165:14)
#81     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1731:7)
#82     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18)
#83     RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:497:19)
#84     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:883:13)
#85     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#86     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
#87     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1081:9)
#88     SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:862:7)
(elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)

════════════════════════════════════════════════════════════════════════════════════════════════════

Another exception was thrown: A RenderFlex overflowed by 99456 pixels on the bottom.

Minimal code to reproduce this is:

import 'package:flutter/material.dart';
import 'package:xterm/xterm.dart';
import 'package:xterm/flutter.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.teal,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final terminal = Terminal(
    maxLines: 10000,
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Hello, terminal!"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            TerminalView(
              terminal: terminal,
              style: const TerminalStyle(fontFamily: ['Cascadia Mono']),
            ),
          ],
        ),
      ),
    );
  }
}

pmellati avatar Mar 16 '22 09:03 pmellati

Have you tried putting an Expanded widget around TerminalView:

Expanded(
  child: TerminalView(
    terminal: terminal
    style: const TerminalStyle(fontFamily: ['Cascadia Mono']),
  ),
)

bostrot avatar Mar 26 '22 19:03 bostrot