Flutter 断言失败:file:///C:/flutter/packages/flutter/lib/src/rendering/shifted_box.dart:348:12 child!.hasSize 不正确

Flutter Assertion failed: file:///C:/flutter/packages/flutter/lib/src/rendering/shifted_box.dart:348:12 child!.hasSize is not true

我想要一个 table 的宽度适合 parent 的宽度。因此,我将 double.infinity 用于 child 宽度...但这会导致此错误:

Assertion failed: file:///C:/flutter/packages/flutter/lib/src/rendering/shifted_box.dart:348:12
child!.hasSize
is not true

小部件:

class ObjectDataTable extends StatelessWidget {
  final List<String> columnNames;
  final List<String> rowData;
  const ObjectDataTable({Key? key,required this.rowData, required this.columnNames})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return

      Container(
        width: double.infinity,
        child: Theme(
          data:Theme.of(context).copyWith(
              dividerColor: Colors.transparent),
          child: DataTable(
              columnSpacing: 0,
              dividerThickness: 0,
              columns: List<DataColumn>.generate(
                  columnNames.length,
                  (int index,) => DataColumn(
                        label:  CustomCell(
                          width: double.infinity,
                          columnCnt:columnNames.length ,
                          start: (index==0),
                          end: (index==columnNames.length-1),
                          child: Text(columnNames[index], textAlign: TextAlign.center,),
                          color: AppColors().objectListHeader,),
                        numeric: false,
                      ),
              ),
              rows: <DataRow>[
                DataRow(
                  cells: List<DataCell>.generate(
                    rowData.length,
                        (int index,) => DataCell(CustomCell(
                        width:double.infinity,
                        columnCnt:rowData.length ,
                        start: (index==0),
                        end: (index==rowData.length-1),
                        child: Text(rowData[index], textAlign: TextAlign.center,),
                        ),
                    ),
                  ),
                ),
              ]
    ),
        ),
      );
  }
}

class CustomCell extends StatelessWidget {
  final double width;
  final bool start;
  final bool end;
  final Widget? child;
  final int columnCnt;
  final Color? color;

  const CustomCell({Key? key,
    required this.width,
    required this.columnCnt,
    this.color,
    this.child,
    this.start=false,
    this.end=false}) : super(key: key);

  BorderRadius getBorderRadius(){
    BorderRadius borderRadius=BorderRadius.zero;
    if (!(start&&end)) {
      if (start) {
        borderRadius = BorderRadius.only(
            bottomLeft: Radius.circular(10),
            topLeft: Radius.circular(10));
      }
      else if (end) {
        borderRadius = BorderRadius.only(
            bottomRight: Radius.circular(10),
            topRight: Radius.circular(10));
      }
    }
    return borderRadius;
  }

  Color getColor(){
    Color myColor=AppColors().objectRow;
    if (color!=null){
      myColor=color!;
    }
    return myColor;
  }

  @override
  Widget build(BuildContext context) {

    return
      Container(
        child: child,
        width: width/ columnCnt,
        decoration: BoxDecoration(
          color: getColor(),
          borderRadius:getBorderRadius(),
        ),
    );
  }
}

致电:

child:ObjectDataTable(columnNames: loadColumnNames(),rowData: ["1","2","3","4","5"],),

我不知道为什么,因为错误只针对“header”部分...该行按预期完美运行...

我想要的输出:

我的输出(因为错误):

找到方法:

import 'package:flutter/material.dart';

class ObjectDataTable extends StatelessWidget {
  final List<String> columnNames;
  final List<String> rowData;
  final BoxConstraints constraint; //<--add this
  const ObjectDataTable(
      {Key? key,
      required this.constraint,
      required this.rowData,
      required this.columnNames})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    double width = constraint.maxWidth;//<-- and this (instead of double.infinity use width)
    return Theme(
      data: Theme.of(context).copyWith(dividerColor: Colors.transparent),
      child: DataTable(
          columnSpacing: 0,
          dividerThickness: 0,
          columns: List<DataColumn>.generate(
            columnNames.length,
            (int index,) => DataColumn(
              label: CustomCell(
                width: width, //<-- here
                columnCnt: columnNames.length,
                start: (index == 0),
                end: (index == columnNames.length - 1),
                child: Text(
                  columnNames[index],
                  textAlign: TextAlign.center,
                ),
                color: AppColors().objectListHeader,
              ),
              numeric: false,
            ),
          ),
          rows: <DataRow>[
            DataRow(
              cells: List<DataCell>.generate(
                rowData.length,
                (
                  int index,
                ) =>
                    DataCell(
                  CustomCell(
                    width: width,
                    columnCnt: rowData.length,
                    start: (index == 0),
                    end: (index == rowData.length - 1),
                    child: Text(
                      rowData[index],
                      textAlign: TextAlign.center,
                    ),
                  ),
                ),
              ),
            ),
          ]),
    );
  }
}

通话:

LayoutBuilder(
            builder: (context, constraint) { //<-- and add LayoutBuilder
              return SingleChildScrollView(
                child: ObjectDataTable(constraint:constraint,columnNames: loadColumnNames(),rowData: ["1","2","3","4","5"],),
              );
            },
          )