如何提高 Flutter DataTable Widget 的性能?
How can i improve performance of Flutter DataTable Widget?
DataTable(
columnSpacing: 1,
headingRowHeight: 35,
dataRowHeight: 36,
columns: [
DataColumn(
label: Expanded(
child: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('No')),
),
),
DataColumn(
label: Expanded(
child: Container(
color: Color(int.parse(widget.classObj.color)),
padding: EdgeInsets.symmetric(horizontal: 50, vertical: 5),
child: Utils.tableHeaderText('Name'),
)),
),
if (studentAttendance.isNotEmpty)
for (var item in studentAttendance)
DataColumn(
label: InkWell(
onTap: () => _createDateDeleteDialogue(
context, _user.emailUid, widget.classObj.classId, item),
child: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText(item)),
),
),
if (studentAttendance.isNotEmpty) ...[
DataColumn(
label: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('Total Present')),
),
DataColumn(
label: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('Total Absent')),
),
DataColumn(
label: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('Total Attendance(%)')),
),
]
],
rows: students.map((student) {
int presence = student.attendanceList != null
? student.attendanceList.length
: 0;
int absent = studentAttendance.length - presence;
double percent = (presence * 100) / studentAttendance.length;
final attendanceWidget = AttendanceWidgetList(
student: student,
attendance: studentAttendance,
isPresence: presence == 0 ? false : true,
context: context,
classId: widget.classObj.classId,
email: _user.emailUid,
);
return DataRow(
cells: [
DataCell(
Center(
child: Text(
student.id.toString(),
style: Utils.tableSimpleText(),
),
),
),
DataCell(
Container(
margin: const EdgeInsets.only(right: 5),
child: Text(
student.name,
style: const TextStyle(fontSize: 17, color: Colors.black),
),
),
),
if (student.attendanceList != null &&
studentAttendance.isNotEmpty)
if (presence == 0)
...attendanceWidget.attendanceListWidget().map((e) => e)
else if (absent == 0)
...attendanceWidget.attendanceListWidget().map((e) => e)
else
...studentAttendance.map((e) {
if (student.attendanceList.contains(e)) {
return AttendanceWidgetList(
student: student,
attendance: studentAttendance,
isPresence: true,
date: e,
context: context,
classId: widget.classObj.classId,
email: _user.emailUid,
).attendanceSetter();
} else {
return AttendanceWidgetList(
student: student,
attendance: studentAttendance,
isPresence: false,
date: e,
context: context,
classId: widget.classObj.classId,
email: _user.emailUid,
).attendanceSetter();
}
})
else
...attendanceWidget.attendanceListWidget().map((e) => e),
if (studentAttendance.isNotEmpty) ...[
DataCell(
Center(
child: Text(
presence.toString(),
style: Utils.tableSimpleText(),
),
),
),
DataCell(
Center(
child: Text(absent.toString(),
style: Utils.tableSimpleText()),
),
),
DataCell(
Center(
child: Text("${percent.toStringAsFixed(2)} %",
style: Utils.tableSimpleText()),
),
),
],
],
);
}).toList(),
),
我已经尝试了所有可能的解决方案,例如在数据表中添加一些较少的小部件。
但是 DataTable 的性能并没有提高。
所以,任何知道如何提高 DataTable 性能的人
参考数据表视频 Link : https://drive.google.com/drive/folders/1vpdt0uBK5JV88wHabw6zd-dK76EFF_nR?usp=sharing
使用 PaginatedDataTable()
而不是 DataTable()
小部件。
分页数据table显示每页数据行并提供用于显示其他页面的控件。
DataTable(
columnSpacing: 1,
headingRowHeight: 35,
dataRowHeight: 36,
columns: [
DataColumn(
label: Expanded(
child: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('No')),
),
),
DataColumn(
label: Expanded(
child: Container(
color: Color(int.parse(widget.classObj.color)),
padding: EdgeInsets.symmetric(horizontal: 50, vertical: 5),
child: Utils.tableHeaderText('Name'),
)),
),
if (studentAttendance.isNotEmpty)
for (var item in studentAttendance)
DataColumn(
label: InkWell(
onTap: () => _createDateDeleteDialogue(
context, _user.emailUid, widget.classObj.classId, item),
child: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText(item)),
),
),
if (studentAttendance.isNotEmpty) ...[
DataColumn(
label: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('Total Present')),
),
DataColumn(
label: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('Total Absent')),
),
DataColumn(
label: Container(
color: Color(int.parse(widget.classObj.color)),
padding: Utils.tableHeaderPadding(),
child: Utils.tableHeaderText('Total Attendance(%)')),
),
]
],
rows: students.map((student) {
int presence = student.attendanceList != null
? student.attendanceList.length
: 0;
int absent = studentAttendance.length - presence;
double percent = (presence * 100) / studentAttendance.length;
final attendanceWidget = AttendanceWidgetList(
student: student,
attendance: studentAttendance,
isPresence: presence == 0 ? false : true,
context: context,
classId: widget.classObj.classId,
email: _user.emailUid,
);
return DataRow(
cells: [
DataCell(
Center(
child: Text(
student.id.toString(),
style: Utils.tableSimpleText(),
),
),
),
DataCell(
Container(
margin: const EdgeInsets.only(right: 5),
child: Text(
student.name,
style: const TextStyle(fontSize: 17, color: Colors.black),
),
),
),
if (student.attendanceList != null &&
studentAttendance.isNotEmpty)
if (presence == 0)
...attendanceWidget.attendanceListWidget().map((e) => e)
else if (absent == 0)
...attendanceWidget.attendanceListWidget().map((e) => e)
else
...studentAttendance.map((e) {
if (student.attendanceList.contains(e)) {
return AttendanceWidgetList(
student: student,
attendance: studentAttendance,
isPresence: true,
date: e,
context: context,
classId: widget.classObj.classId,
email: _user.emailUid,
).attendanceSetter();
} else {
return AttendanceWidgetList(
student: student,
attendance: studentAttendance,
isPresence: false,
date: e,
context: context,
classId: widget.classObj.classId,
email: _user.emailUid,
).attendanceSetter();
}
})
else
...attendanceWidget.attendanceListWidget().map((e) => e),
if (studentAttendance.isNotEmpty) ...[
DataCell(
Center(
child: Text(
presence.toString(),
style: Utils.tableSimpleText(),
),
),
),
DataCell(
Center(
child: Text(absent.toString(),
style: Utils.tableSimpleText()),
),
),
DataCell(
Center(
child: Text("${percent.toStringAsFixed(2)} %",
style: Utils.tableSimpleText()),
),
),
],
],
);
}).toList(),
),
我已经尝试了所有可能的解决方案,例如在数据表中添加一些较少的小部件。 但是 DataTable 的性能并没有提高。
所以,任何知道如何提高 DataTable 性能的人 参考数据表视频 Link : https://drive.google.com/drive/folders/1vpdt0uBK5JV88wHabw6zd-dK76EFF_nR?usp=sharing
使用 PaginatedDataTable()
而不是 DataTable()
小部件。
分页数据table显示每页数据行并提供用于显示其他页面的控件。