flutter_html icon indicating copy to clipboard operation
flutter_html copied to clipboard

[BUG] HTML tables do not render

Open mariapapag opened this issue 1 year ago • 16 comments

Describe the bug:

HTML tables are not shown, instead I see text "TABLE SECTION"

HTML to reproduce the issue:

<section>
   <div id="sec-zm2256-sec">
      <h2 data-fingerprint="b4cb0a40" data-fingerprint-exact="e7c3d1bb”>REDACTED</h2>
      <p data-fingerprint="739ccdbe" data-fingerprint-exact="e394d5ac">REDACTED</p>
      <h3 data-fingerprint="2d5bd997" data-fingerprint-exact="f305843d">REDACTED</h3>
      <table data-fingerprint="aeb1c0d0" data-fingerprint-exact="db2c1acc">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED:</p>
                  <br/> 
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="628373a7" data-fingerprint-exact="339c8b39">REDACTED</h3>
      <table data-fingerprint="399657ff" data-fingerprint-exact="51ef4eb2">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <ul>
                     <li>REDACTED</li>
                     <li>REDACTED</li>
                  </ul>
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="e28c86a1" data-fingerprint-exact="c2e57ce0">REDACTED</h3>
      <table data-fingerprint="10efa886" data-fingerprint-exact="8f96c7ca">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="d6e2f4e1" data-fingerprint-exact="cb204d9a">REDACTED</h3>
      <table data-fingerprint="6a508d74" data-fingerprint-exact="b3f5f530">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="a0f7905e" data-fingerprint-exact="6d92b9d4">REDACTED</h3>
      <ul data-fingerprint="1b7c8504" data-fingerprint-exact="24bbacc6">
         <li>REDACTED</li>
         <li>REDACTED</li>
         <li>REDACTED</li>
         <li>REDACTED</li>
      </ul>
   </div>
</section>

Html widget configuration:

Expected behavior:

Screenshots:

Simulator Screen Shot - iPhone 13 Pro Max - 2022-11-08 at 14 44 42

Device details and Flutter/Dart/flutter_html versions:

Flutter 3.3.7, stable channel, flutter_html version ^3.0.0-alpha.5

Stacktrace/Logcat

Additional info:

A picture of a cute animal (not mandatory but encouraged)

Screen Shot 2022-11-08 at 2 53 09 PM

mariapapag avatar Nov 08 '22 19:11 mariapapag

You also need to add flutter_html_table. (Sorry for the short reply, I'm on my phone.)

erickok avatar Nov 08 '22 21:11 erickok

@erickok Thank you for your reply. I have added flutter_html_table package and returning HTML like below, and seeing a lot of layout issues (RenderBox was not laid out, Intrinsics are not available, etc). Is there an example style map that has worked in the past?

  Widget build(BuildContext context) {
    return Html(
      data: data,
      style: style,
      onLinkTap: onLinkTap,
      tagsList: Html.tags,
      customRenders: <CustomRenderMatcher, CustomRender>{
        tableMatcher(): tableRender(),
      }
     );

mariapapag avatar Nov 10 '22 19:11 mariapapag

Since adding the flutter_html_table package, ContainerSpan is no longer defined as well.

import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html_table/flutter_html_table.dart';
...
Widget build(BuildContext context) {
    return Html(
      data: data,
      style: style,
      onLinkTap: onLinkTap,
      tagsList: Html.tags,
      customRenders: <CustomRenderMatcher, CustomRender>{
        tableMatcher(): tableRender(),
        tagMatcher('a'): CustomRender.widget(
          widget: (RenderContext context, List<InlineSpan> Function() _inlineSpans) {
            return GestureDetector(
              onTap: onTap,
              child: ContainerSpan(....)   // The method 'ContainerSpan' isn't defined for... 
            )
          }
        )
      }
     );

mariapapag avatar Nov 10 '22 19:11 mariapapag

Yes the examples all has working examples but your html is probably not supported. You may paste an example html here so er can check. Note that nested tables are currently unsupported.

erickok avatar Nov 10 '22 19:11 erickok

I have the HTML that I'm trying to make work posted in the first comment here

mariapapag avatar Nov 10 '22 19:11 mariapapag

<section>
   <div id="sec-zm2256-sec">
      <h2 data-fingerprint="b4cb0a40" data-fingerprint-exact="e7c3d1bb”>REDACTED</h2>
      <p data-fingerprint="739ccdbe" data-fingerprint-exact="e394d5ac">REDACTED</p>
      <h3 data-fingerprint="2d5bd997" data-fingerprint-exact="f305843d">REDACTED</h3>
      <table data-fingerprint="aeb1c0d0" data-fingerprint-exact="db2c1acc">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED:</p>
                  <br/> 
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="628373a7" data-fingerprint-exact="339c8b39">REDACTED</h3>
      <table data-fingerprint="399657ff" data-fingerprint-exact="51ef4eb2">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <ul>
                     <li>REDACTED</li>
                     <li>REDACTED</li>
                  </ul>
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="e28c86a1" data-fingerprint-exact="c2e57ce0">REDACTED</h3>
      <table data-fingerprint="10efa886" data-fingerprint-exact="8f96c7ca">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="d6e2f4e1" data-fingerprint-exact="cb204d9a">REDACTED</h3>
      <table data-fingerprint="6a508d74" data-fingerprint-exact="b3f5f530">
         <colgroup>
            <col/>
         </colgroup>
         <tbody>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
            <tr>
               <td>
                  <p>REDACTED</p>
                  <br/> 
               </td>
            </tr>
         </tbody>
      </table>
      <h3 data-fingerprint="a0f7905e" data-fingerprint-exact="6d92b9d4">REDACTED</h3>
      <ul data-fingerprint="1b7c8504" data-fingerprint-exact="24bbacc6">
         <li>REDACTED</li>
         <li>REDACTED</li>
         <li>REDACTED</li>
         <li>REDACTED</li>
      </ul>
   </div>
</section>

mariapapag avatar Nov 15 '22 18:11 mariapapag

Can confirm that tables within a Single Child Scrollview are now broken on our project with 3.0.0-alpha.6 Have tried #1191 as a workaround, but sadly this only fixes the layout issues for now, and scrolling/sizing of table content is otherwise broken.

TDuffinNTU avatar Nov 21 '22 15:11 TDuffinNTU

I don't use sizing and I don't know if it's worked earlier, but scrolling works acceptably with this temporary solution at the moment

  flutter_html:
    git:
      url: [email protected]:darkstarx/flutter_html.git
      ref: master
  flutter_html_table:
    git:
      url: [email protected]:darkstarx/flutter_html.git
      path: packages/flutter_html_table
      ref: master

Example of usage:

import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html_table/flutter_html_table.dart';
...
    final theme = Theme.of(context);
    final l10n = L10n.of(context);
    final htmlStyle = AppStyle.htmlStyle(theme,
      textStyle: theme.textTheme.subtitle2,
      custom: {
        'h1': Style(fontSize: FontSize(17.0)),
        'h2': Style(fontSize: FontSize(15.0)),
        'tr': Style(
          border: Border.all(
            color: AppStyle.darkColors.textColor,
            strokeAlign: StrokeAlign.center,
          ),
        ),
        'td': Style(
          padding: const EdgeInsets.all(4.0),
          alignment: Alignment.center,
          textAlign: TextAlign.center,
        ),
        'p': Style(textAlign: TextAlign.start),
      }
    );
    return FutureBuilder<String>(
      future: _fileLoader,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return SingleChildScrollView(
            child: Column(
              children: [
                const SizedBox(height: 10.0),
                Html(
                  data: snapshot.data,
                  style: htmlStyle,
                  customRenders: { tableMatcher(): tableRender() },
                  onLinkTap: (link, ctx, attributes, _) => processLink(link),
                ),
              ],
            ),
          );
        } else if (snapshot.hasError) {
          final details = snapshot.error is String ? '${snapshot.error}' : null;
          return Center(child: Text(l10n.failedToLoadDocument(details)));
        }
        return const Center(child: CircularProgressIndicator());
      },
    );

telegram-cloud-photo-size-2-5204291475943309669-y

darkstarx avatar Nov 29 '22 22:11 darkstarx

@darkstarx It's likely that it's on our end as we're using Umbraco, which probably inserts some funky HTML. Would recommend people give your change a go in case it fixes it for you!

TDuffinNTU avatar Dec 05 '22 14:12 TDuffinNTU

@mariapapag I don't know the reason but adding tags like <p> or <ul> inside <td> gives an error. If you try removing <p> and <ul> tags inside <td> your table will render properly.

jeet2609 avatar Feb 22 '23 06:02 jeet2609

I came to a workaround solution where I reuse Html widget itself forcing all html inside each table cell to be inline. I do this with a custom table render function that is copied from flutter_html_table source code as a start point.

I also added a SingleChildScrollView to get back the horizontal scroll and in my custom function, as it was possible in flutter_html: ^2.2.1. And with my _renderTableCell function i can manage the style of the content of each table cell, in my case i handle the cell width based on the screen size to get a nice horizontal scroll sizing.

As you can see I injected my code as a substitute for the CssBoxWidget.withInlineSpanChildren function.

This is my solution tested in Flutter 3.7.9, with flutter_html: ^3.0.0-alpha.6 and flutter_html_table: ^3.0.0-alpha.4

Usage:

return Html(
      shrinkWrap: true,
      data: html,
      style: style,
      customRenders: {
        // tableMatcher(): tableRender(),
        tableMatcher(): customTableRender(onLinkTap: _onLinkTap),
      },
      onLinkTap: _onLinkTap,
    );

custom_html_table.dart

library flutter_html_table;

import 'dart:math';

import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:html/dom.dart' as dom;

typedef OnLinkTapCallback = void Function(
  String? url,
  RenderContext renderContext,
  Map<String, String> attributes,
  dom.Element? element,
);

/// The CustomRender function that will render the <table> HTML tag
CustomRender customTableRender({OnLinkTapCallback? onLinkTap}) =>
    CustomRender.widget(widget: (context, buildChildren) {
      return CssBoxWidget(
        key: context.key,
        style: context.style,
        child: LayoutBuilder(
          builder: (_, constraints) =>
              _layoutCells(context, constraints, onLinkTap),
          // builder: (_, constraints) => oldLayoutCells(context, constraints),
        ),
      );
    });

/// A CustomRenderMatcher for matching the <table> HTML tag
CustomRenderMatcher tableMatcher() => (context) {
      return context.tree.element?.localName == "table";
    };

Widget _layoutCells(
  RenderContext context,
  BoxConstraints constraints,
  OnLinkTapCallback? onLinkTap,
) {
  final rows = <TableRowLayoutElement>[];
  List<TrackSize> columnSizes = <TrackSize>[];
  for (var child in context.tree.children) {
    if (child is TableStyleElement) {
      // Map <col> tags to predetermined column track sizes
      columnSizes = child.children
          .where((c) => c.name == "col")
          .map((c) {
            final span = int.tryParse(c.attributes["span"] ?? "1") ?? 1;
            final colWidth = c.attributes["width"];
            return List.generate(span, (index) {
              if (colWidth != null && colWidth.endsWith("%")) {
                if (!constraints.hasBoundedWidth) {
                  // In a horizontally unbounded container; always wrap content instead of applying flex
                  return const IntrinsicContentTrackSize();
                }
                final percentageSize =
                    double.tryParse(colWidth.substring(0, colWidth.length - 1));
                return percentageSize != null && !percentageSize.isNaN
                    ? FlexibleTrackSize(percentageSize * 0.01)
                    : const IntrinsicContentTrackSize();
              } else if (colWidth != null) {
                final fixedPxSize = double.tryParse(colWidth);
                return fixedPxSize != null
                    ? FixedTrackSize(fixedPxSize)
                    : const IntrinsicContentTrackSize();
              } else {
                return const IntrinsicContentTrackSize();
              }
            });
          })
          .expand((element) => element)
          .toList(growable: false);
    } else if (child is TableSectionLayoutElement) {
      rows.addAll(child.children.whereType());
    } else if (child is TableRowLayoutElement) {
      rows.add(child);
    }
  }

  // All table rows have a height intrinsic to their (spanned) contents
  final rowSizes =
      List.generate(rows.length, (_) => const IntrinsicContentTrackSize());

  // Calculate column bounds
  int columnMax = 0;
  List<int> rowSpanOffsets = [];
  for (final row in rows) {
    final cols = row.children
            .whereType<TableCellElement>()
            .fold(0, (int value, child) => value + child.colspan) +
        rowSpanOffsets.fold<int>(0, (int offset, child) => child);
    columnMax = max(cols, columnMax);
    rowSpanOffsets = [
      ...rowSpanOffsets.map((value) => value - 1).where((value) => value > 0),
      ...row.children
          .whereType<TableCellElement>()
          .map((cell) => cell.rowspan - 1),
    ];
  }

  // Place the cells in the rows/columns
  final cells = <GridPlacement>[];
  final columnRowOffset = List.generate(columnMax, (_) => 0);
  final columnColspanOffset = List.generate(columnMax, (_) => 0);
  int rowi = 0;
  for (var row in rows) {
    int columni = 0;
    for (var child in row.children) {
      if (columni > columnMax - 1) {
        break;
      }
      if (child is TableCellElement) {
        while (columnRowOffset[columni] > 0) {
          columnRowOffset[columni] = columnRowOffset[columni] - 1;
          columni +=
              columnColspanOffset[columni].clamp(1, columnMax - columni - 1);
        }
        cells.add(GridPlacement(
          columnStart: columni,
          columnSpan: min(child.colspan, columnMax - columni),
          rowStart: rowi,
          rowSpan: min(child.rowspan, rows.length - rowi),
          child: CssBoxWidget(
            style: child.style
                .merge(row.style), //TODO padding/decoration(color/border)
            child: SizedBox.expand(
              child: Container(
                alignment: child.style.alignment ??
                    context.style.alignment ??
                    Alignment.centerLeft,
                child: _renderTableCell(context, child, columnMax, onLinkTap),
                // child: CssBoxWidget.withInlineSpanChildren(
                //   children: [context.parser.parseTree(context, child)],
                //   style: child.style, //TODO updated this. Does it work?
                // ),
              ),
            ),
          ),
        ));
        columnRowOffset[columni] = child.rowspan - 1;
        columnColspanOffset[columni] = child.colspan;
        columni += child.colspan;
      }
    }
    while (columni < columnRowOffset.length) {
      columnRowOffset[columni] = columnRowOffset[columni] - 1;
      columni++;
    }
    rowi++;
  }

  // Create column tracks (insofar there were no colgroups that already defined them)
  List<TrackSize> finalColumnSizes = columnSizes.take(columnMax).toList();
  finalColumnSizes += List.generate(max(0, columnMax - finalColumnSizes.length),
      (_) => const IntrinsicContentTrackSize());

  if (finalColumnSizes.isEmpty || rowSizes.isEmpty) {
    // No actual cells to show
    return const SizedBox();
  }

  return SingleChildScrollView(
    scrollDirection: Axis.horizontal,
    child: LayoutGrid(
      gridFit: GridFit.loose,
      columnSizes: finalColumnSizes,
      rowSizes: rowSizes,
      children: cells,
    ),
  );
}

Widget _renderTableCell(
  RenderContext context,
  StyledElement tree,
  int columnMax,
  OnLinkTapCallback? onLinkTap,
) {
  final width = MediaQuery.of(context.buildContext).size.width;

  return Container(
    constraints:
        BoxConstraints(maxWidth: columnMax > 1 ? width / 3 * 2 : width - 35),
    padding: EdgeInsets.all(5),
    child: Html(
      shrinkWrap: true,
      data: tree.element?.innerHtml,
      style: {
        '*': Style(display: Display.inline),
      },
      onLinkTap: onLinkTap,
    ),
  );
}

Preview:

preview

fabianotavallini avatar Apr 03 '23 11:04 fabianotavallini

I'm having issues rendering this table, but I don't know if it's something that I can fix or if the issues comes from the package. Do you have any advices?

I'm using those versions:

flutter_html: ^3.0.0-beta.2
flutter_html_table: ^3.0.0-beta.2
<table id="table-id" class="table table-responsive" border="0" data-mce-fragment="1" bordercolor="#eee">
   <tr data-mce-fragment="1">
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">TEST</strong></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test -</strong><span data-mce-fragment="1">&nbsp;</span><em data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></em></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test -</strong><span data-mce-fragment="1">&nbsp;</span><em data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></em></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></p>
      </td>
   </tr>
   <tr data-mce-fragment="1">
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
   </tr>
</table>

Error:

The following RenderObject was being processed when the exception was fired: RenderLayoutGrid#bf57a relayoutBoundary=up25 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
  creator: LayoutGrid ← LayoutBuilder ← MediaQuery ← Padding ← DecoratedBox ← ConstrainedBox ←
    Container ← _CSSBoxRenderer ← CssBoxWidget ← Semantics ← RichText ← Text ← ⋯
  parentData: offset=Offset(0.0, 0.0) (can use size)
  constraints: BoxConstraints(w=337.0, 0.0<=h<=Infinity)
  size: MISSING

lorenzOliveto avatar Jun 01 '23 10:06 lorenzOliveto

@lorenzOliveto We have the same problem when we have p tag in td.

mudita33 avatar Jun 05 '23 08:06 mudita33

Any update on this, please? Rendering, a p, div, etc inside a td prevents the table from rendering.

dan1er avatar Oct 10 '23 01:10 dan1er

i have the same issue, any update?

javier-gantri avatar Oct 10 '23 01:10 javier-gantri

I'm having issues rendering this table, but I don't know if it's something that I can fix or if the issues comes from the package. Do you have any advices?

I'm using those versions:

flutter_html: ^3.0.0-beta.2
flutter_html_table: ^3.0.0-beta.2
<table id="table-id" class="table table-responsive" border="0" data-mce-fragment="1" bordercolor="#eee">
   <tr data-mce-fragment="1">
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">TEST</strong></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test -</strong><span data-mce-fragment="1">&nbsp;</span><em data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></em></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test -</strong><span data-mce-fragment="1">&nbsp;</span><em data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></em></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1"><strong data-mce-fragment="1">Test</strong></p>
      </td>
   </tr>
   <tr data-mce-fragment="1">
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
      <td data-mce-fragment="1">
         <p data-mce-fragment="1">Lorem</p>
      </td>
   </tr>
</table>

Error:

The following RenderObject was being processed when the exception was fired: RenderLayoutGrid#bf57a relayoutBoundary=up25 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
  creator: LayoutGrid ← LayoutBuilder ← MediaQuery ← Padding ← DecoratedBox ← ConstrainedBox ←
    Container ← _CSSBoxRenderer ← CssBoxWidget ← Semantics ← RichText ← Text ← ⋯
  parentData: offset=Offset(0.0, 0.0) (can use size)
  constraints: BoxConstraints(w=337.0, 0.0<=h<=Infinity)
  size: MISSING

Hey @lorenzOliveto were you able to figure out a workaround for this?

dan1er avatar Oct 10 '23 01:10 dan1er