David Holkup
David Holkup

Reputation: 442

Can't get Flutter's DataTable work with fetched data (works with hard-coded data - MYSTERY)

I'm facing problem that is really strange for me.

I'm trying to use Flutter's DataTable widget. It works with hardcoded mockup data, but as soon as I try it with real data, I get exceptions.

======== Exception caught by rendering library =====================================================
The following assertion was thrown during performLayout():
LayoutBuilder does not support returning intrinsic dimensions.

Calculating the intrinsic dimensions would require running the layout callback speculatively, which might mutate the live render object tree.
The relevant error-causing widget was: 
  DataTable file:///home/david/evidence-system/evidence-system-ui/lib/app/services/history/view/history.dart:41:24
When the exception was thrown, this was the stack: 
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 236:49  throw_
packages/flutter/src/widgets/layout_builder.dart 390:9                        <fn>
packages/flutter/src/widgets/layout_builder.dart 396:14                       [_debugThrowIfNotCheckingIntrinsics]
packages/flutter/src/widgets/layout_builder.dart 332:12                       computeMaxIntrinsicWidth
packages/flutter/src/rendering/box.dart 1377:23                               <fn>
...
The following RenderObject was being processed when the exception was fired: RenderTable#0d365 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...  parentData: <none> (can use size)
...  constraints: BoxConstraints(w=824.0, h=643.0)
...  size: MISSING
...  specified column widths: {0: IntrinsicColumnWidth(flex: null), 1: IntrinsicColumnWidth(flex: null), 2: IntrinsicColumnWidth(flex: null), 3: IntrinsicColumnWidth(flex: null), 4: IntrinsicColumnWidth(flex: null), 5: IntrinsicColumnWidth(flex: null), 6: IntrinsicColumnWidth(flex: null)}
...  default column width: FlexColumnWidth(1.0)
...  table size: 7×2
...  column offsets: unknown
...  row offsets: []
RenderObject: RenderTable#0d365 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
  parentData: <none> (can use size)
  constraints: BoxConstraints(w=824.0, h=643.0)
  size: MISSING
  specified column widths: {0: IntrinsicColumnWidth(flex: null), 1: IntrinsicColumnWidth(flex: null), 2: IntrinsicColumnWidth(flex: null), 3: IntrinsicColumnWidth(flex: null), 4: IntrinsicColumnWidth(flex: null), 5: IntrinsicColumnWidth(flex: null), 6: IntrinsicColumnWidth(flex: null)}
  default column width: FlexColumnWidth(1.0)
  table size: 7×2
  column offsets: unknown
  row offsets: []
...  child (0, 0): RenderSemanticsAnnotations#2c88c NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#9e99d NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(basic)
...      child: RenderSemanticsAnnotations#38b3d NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#9dae7 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (1, 0): RenderSemanticsAnnotations#e4381 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#485e9 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(basic)
...      child: RenderSemanticsAnnotations#a8a31 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#c3f75 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (2, 0): RenderSemanticsAnnotations#6eeb9 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#1b90c NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(basic)
...      child: RenderSemanticsAnnotations#8b3ff NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#ec781 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (3, 0): RenderSemanticsAnnotations#d038d NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#9b7b7 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(basic)
...      child: RenderSemanticsAnnotations#d8a18 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#609f8 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (4, 0): RenderSemanticsAnnotations#a3fea NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#abb50 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(basic)
...      child: RenderSemanticsAnnotations#ff154 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#a8038 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (5, 0): RenderSemanticsAnnotations#5fc1a NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#e35cb NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(basic)
...      child: RenderSemanticsAnnotations#84a24 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#1173b NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (6, 0): RenderSemanticsAnnotations#0b1f2 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#0fa2c NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(basic)
...      child: RenderSemanticsAnnotations#02f28 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#ff4c2 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (0, 1): RenderSemanticsAnnotations#60834 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#860da NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(click)
...      child: RenderSemanticsAnnotations#3a794 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#b5a60 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (1, 1): RenderSemanticsAnnotations#37e52 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#3d6b0 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(click)
...      child: RenderSemanticsAnnotations#395e6 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#9dd76 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (2, 1): RenderSemanticsAnnotations#8fd13 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#a89b4 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(click)
...      child: RenderSemanticsAnnotations#8e394 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#57744 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (3, 1): RenderSemanticsAnnotations#a1854 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#aadd8 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(click)
...      child: RenderSemanticsAnnotations#0d64c NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#82d1c NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (4, 1): RenderSemanticsAnnotations#d8a31 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#55a3a NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(click)
...      child: RenderSemanticsAnnotations#7dc63 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#678a3 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (5, 1): RenderSemanticsAnnotations#fec7a NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#89ca3 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(click)
...      child: RenderSemanticsAnnotations#d6bc5 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#ab3ce NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
...  child (6, 1): RenderSemanticsAnnotations#e87e1 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    parentData: offset=Offset(0.0, 0.0); default vertical alignment
...    constraints: MISSING
...    size: MISSING
...    child: RenderMouseRegion#26cd8 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none>
...      constraints: MISSING
...      size: MISSING
...      listeners: enter, exit
...      cursor: SystemMouseCursor(click)
...      child: RenderSemanticsAnnotations#4dff1 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: <none>
...        constraints: MISSING
...        size: MISSING
...        child: RenderPointerListener#f97a0 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          behavior: opaque
...          listeners: down
====================================================================================================

======== Exception caught by rendering library =====================================================
Assertion failed: file:///home/david/snap/flutter/common/flutter/packages/flutter/lib/src/rendering/box.dart:1940:12
hasSize
"RenderBox was not laid out: RenderTable#0d365 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE"
The relevant error-causing widget was: 
  DataTable file:///home/david/evidence-system/evidence-system-ui/lib/app/services/history/view/history.dart:41:24
====================================================================================================

This is my code (FYI I'm using velocityX)

Widget build(BuildContext context) {
    context.read<HistoryCubit>().loadHistory(widget._activityId);
    return Column(
      children: [
        Buttons.neumorphic(context, () {}, text: context.translate("Log Act"))
            .box.alignCenterLeft.make(),
        BlocBuilder<HistoryCubit, HistoryState>(
          builder: (context, state) {
            print("building");
            if (state is HistoryLoading) {
              return normalCircularProgressIndicator();
            }
            if (state is HistoryEmpty) {
              return "History is empty"
                  .text.makeCentered().box.make();
            }
            if (state is HistoryInitialized) {
              return SizedBox(
                width: double.infinity,
                child: DataTable(
                  columns: state.columns, // The problem is here
                  rows: state.rows,       // The problem is here
                ),
              );
            } else {
              throw Exception("Unknown history state $state");
            }
          },
        ).box.make().expand(),
      ],
    );
  }

The problem disappears when I use hard-coded values for columns and rows so the issue may be in my column and row construction, but I don't see it.

  List<DataColumn> generateColumnDefinition(List<HistoryColumnDTO> columns) {
    return [
      DataColumn(label: Text("")),
      ...columns.map((e) => DataColumn(
        label: e.name.text.make(),
        numeric: e.dataType.type == DataType.Number
      )),
    ];
  }

  List<DataRow> generateRowDefinition(List<HistoryRowDTO> rows) {
    return rows.map((HistoryRowDTO e) {
      return DataRow(cells: [
        ...e.values.map((e) => DataCell(e.value.toString().text.make())),
      ]);
    }).toList();
  }

If you could help me, it would be awesome, thank you.

Upvotes: 1

Views: 1053

Answers (1)

Pawann Kumaarr
Pawann Kumaarr

Reputation: 689

Inside DataTable - When you are using Text widget inside DataCell, use isIntrinsic prop along with your text. For eg - e.value.toString().text.isIntrinsic.make(). Let me know if it doesn’t work.

Upvotes: 2

Related Questions