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"],),
);
},
)
我想要一个 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"],),
);
},
)