Skip to content

Unbounded ErrorWidget destroys the desktop layout when any widget throws #119

Description

@leduckhc

Summary

When any widget in the desktop shell throws during build, Flutter's default debug ErrorWidget is rendered inline into an unbounded slot. It expands to the full height of the error text and blows out the layout, so a single broken tile presents as total app failure.

What was observed

During the crash triaged in #116, the app rendered the provider error text plus a ~35-frame stack trace directly into the sidebar/canvas area, ending with:

BOTTOM OVERFLOWED BY 99084 PIXELS

The app was unusable. The underlying fault was one provider — everything else could still have rendered.

Cause

There is no ErrorWidget.builder override anywhere in app/lib (grep for ErrorWidget returns nothing). So debug builds get Flutter's default, which renders the full exception message and the full stack trace as unconstrained text. Dropped into a Column/scroll slot that expects a bounded child, it overflows by however tall the stack trace happens to be.

Why it is worth fixing

This is a diagnosability problem more than a cosmetic one. In the incident:

  • the visible error named split_view.dart:434 and desktop_sidebar.dart:39, neither of which was at fault
  • the actual first exception was only in the flutter run console
  • because the overflow destroyed the layout, there was no way to tell from the screen that the rest of the app was fine

A compact, bounded error box would have kept the app legible and made it obvious that one pane had failed rather than the whole shell.

Suggested fix

  • Install an ErrorWidget.builder that renders a bounded, compact error box: short message, no inline stack trace, clipped to its slot, visually obviously an error. Keep the full detail going to the console/log where it is already usable.
  • Consider a per-pane error boundary so a single failing pane degrades to a "this pane failed" tile while its siblings keep rendering — the split/tab shell is the natural seam for that.
  • Keep release behaviour unchanged (release ErrorWidget is already terse).

Notes

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions