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
Summary
When any widget in the desktop shell throws during build, Flutter's default debug
ErrorWidgetis 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:
The app was unusable. The underlying fault was one provider — everything else could still have rendered.
Cause
There is no
ErrorWidget.builderoverride anywhere inapp/lib(grep forErrorWidgetreturns nothing). So debug builds get Flutter's default, which renders the full exception message and the full stack trace as unconstrained text. Dropped into aColumn/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:
split_view.dart:434anddesktop_sidebar.dart:39, neither of which was at faultflutter runconsoleA 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
ErrorWidget.builderthat 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.ErrorWidgetis already terse).Notes