【问题标题】:Flutter Assertion failed: file:///C:/flutter/packages/flutter/lib/src/rendering/shifted_box.dart:348:12 child!.hasSize is not trueFlutter 断言失败:file:///C:/flutter/packages/flutter/lib/src/rendering/shifted_box.dart:348:12 child!.hasSize 不正确
【发布时间】:2023-03-14 12:55:01
【问题描述】:

我想要一个宽度适合父级宽度的表格。因此,我使用 double.infinity 作为子宽度...但这会导致此错误:

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"],),

我不知道为什么,因为错误只出现在“标题”部分...该行正常工作...

我想要的输出:

我的输出(因为错误):

【问题讨论】:

    标签: flutter datatable


    【解决方案1】:

    找到了一条路:

    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"],),
                  );
                },
              )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-24
      • 2022-12-16
      • 2021-03-22
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 2021-02-23
      • 2018-08-28
      相关资源
      最近更新 更多