- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
遵循此处的示例并彻底阅读 documentation here ,我根本不明白为什么我的专栏没有显示所有内容。
参见此屏幕截图,但电子邮件和电话号码列被截断:
我试图注意的事情:
任何帮助解释为什么会发生这种情况的帮助将不胜感激,谢谢。
import 'package:flutter/material.dart';
import 'package:gt_elite/datasource/athlete_data_source.dart';
import 'package:gt_elite/helpers/colors.dart';
import 'package:gt_elite/helpers/constants.dart';
import 'package:gt_elite/helpers/gt_text_style.dart';
import 'package:gt_elite/models/team.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:easy_localization/easy_localization.dart';
class ManagementAdminScreen extends StatelessWidget {
final Team team;
ManagementAdminScreen({@required this.team});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
color: Colors.white,
child: SfDataGrid(
source: AthleteDataSource(
athletes: team.getAthletesForProfile(Profile.athlete),
),
columnWidthMode: ColumnWidthMode.auto,
columnWidthCalculationRange: ColumnWidthCalculationRange.allRows,
frozenColumnsCount: 0,
columns: [
_buildColumn('avatar', 'profile.athlete'),
_buildColumn('email', 'email'),
_buildColumn('phoneNumber', 'phoneNumber'),
_buildColumn('birthdate', 'birthdate'),
_buildColumn('height', 'height'),
],
)),
);
}
GridColumn _buildColumn(String name, String lbl) {
return GridColumn(
autoFitPadding: EdgeInsets.symmetric(horizontal: 16.0),
columnName: name,
label: Container(
padding: EdgeInsets.symmetric(horizontal: 16.0),
alignment: Alignment.centerLeft,
child: Text(
lbl.tr(),
style: GTTextStyle.subtitle2.copyWith(
color: GTColors.textGrey,
),
softWrap: false,
),
),
);
}
}
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:gt_elite/helpers/gt_text_style.dart';
import 'package:gt_elite/helpers/string.dart';
import 'package:gt_elite/models/athlete.dart';
import 'package:intl/intl.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:url_launcher/url_launcher.dart';
class AthleteDataSource extends DataGridSource {
final _dateFormatter = DateFormat.yMd();
AthleteDataSource({List<Athlete> athletes}) {
dataGridRows = athletes
.map<DataGridRow>(
(dataGridRow) => DataGridRow(
cells: [
DataGridCell<Athlete>(
columnName: 'avatar',
value: dataGridRow,
),
DataGridCell<String>(
columnName: 'email',
value: dataGridRow.email,
),
DataGridCell<String>(
columnName: 'phone',
value: dataGridRow.phoneNumber,
),
DataGridCell<DateTime>(
columnName: 'birthdate',
value: dataGridRow.birthdate,
),
DataGridCell<double>(
columnName: 'height',
value: dataGridRow.height,
),
],
),
)
.toList();
}
List<DataGridRow> dataGridRows = [];
@override
List<DataGridRow> get rows => dataGridRows;
@override
bool shouldRecalculateColumnWidths() {
return true;
}
void _launchCaller(String url) async {
final uri = Uri.parse(url);
if (await canLaunchUrl(uri)) {
await launchUrl(uri);
} else {
throw 'Could not launch $uri';
}
}
@override
DataGridRowAdapter buildRow(DataGridRow row) {
return DataGridRowAdapter(
cells: row.getCells().map<Widget>((dataGridCell) {
// Avatar cell
if (dataGridCell.columnName == 'avatar') {
if (dataGridCell.value.getAvatarUrl() != null) {
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
SizedBox(
width: 18,
),
if (dataGridCell.value.getAvatarUrl() != null)
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: Container(
width: 30,
height: 30,
// decoration: getBoxDecoration(),
child: ClipOval(
child: CachedNetworkImage(
height: 30,
width: 30,
imageUrl: dataGridCell.value.getAvatarUrl(),
placeholder: (context, url) =>
CircularProgressIndicator(),
errorWidget: (context, url, error) =>
Icon(Icons.error),
),
),
),
),
if (dataGridCell.value.getAvatarUrl() == null)
SizedBox(
width: 30,
),
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
FittedBox(
fit: BoxFit.scaleDown,
child: Text(
"${StringHelper.shortName(dataGridCell.value.lastName, nameLimit: 15)}",
textAlign: TextAlign.left,
style: GTTextStyle.subtitle2,
),
),
FittedBox(
fit: BoxFit.scaleDown,
child: Text(
"${StringHelper.shortName(dataGridCell.value.firstName, nameLimit: 15)}",
textAlign: TextAlign.left,
style: GTTextStyle.body,
),
),
],
)
]);
}
}
if (dataGridCell.columnName == 'birthdate') {
if (dataGridCell.value == null) return Container();
return Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
_dateFormatter.format(dataGridCell.value),
// overflow: TextOverflow.ellipsis,
style: GTTextStyle.body,
softWrap: false,
));
}
if (dataGridCell.columnName == 'phone') {
if (dataGridCell.value == null) return Container();
return InkWell(
onTap: () {
String phoneNumber = dataGridCell.value;
phoneNumber = phoneNumber.replaceAll(" ", "").replaceAll(".", "");
_launchCaller('tel:${phoneNumber}');
},
child: Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
dataGridCell.value.toString(),
// overflow: TextOverflow.ellipsis,
style: GTTextStyle.body,
softWrap: false,
)),
);
}
if (dataGridCell.columnName == 'email') {
if (dataGridCell.value == null) return Container();
return InkWell(
onTap: () {
String val = dataGridCell.value;
val = val.replaceAll(" ", "");
_launchCaller('mailto:${val}');
},
child: Container(
alignment: Alignment.centerLeft,
// The autoFitPadding and the cell padding value should be same.
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
// dataGridCell.value.toString(),
"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a9989b9addc1c0dac0dac8dbccc8c5c5d0c5c6c7ceccc4c8c0c5e9c5c6c7ceccc4c8c0c5cdc6c4c8c0c787cac6c4" rel="noreferrer noopener nofollow">[email protected]</a>",
// overflow: TextOverflow.ellipsis,
style: GTTextStyle.body,
softWrap: false,
)),
);
}
if (dataGridCell.columnName == 'height') {
if (dataGridCell.value == null) return Container();
return Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
dataGridCell.value.toString(),
// overflow: TextOverflow.ellipsis,
style: GTTextStyle.body,
softWrap: false,
));
}
return Container();
}).toList());
}
}
最佳答案
您正在为单元格小部件使用不同的文本样式。默认情况下,单元格宽度是根据默认文本样式计算的。要根据不同的 TextStyle 计算单元格宽度,只需重写标题的 computeHeaderCellWidth 方法和单元格的 computeCellWidth 方法,并返回具有所需 TextStyle 的 super 方法。请检查以下示例和代码片段。
在数据网格中:
final CustomColumnSizer _customColumnSizer = CustomColumnSizer();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter SfDataGrid'),
),
body: SfDataGrid(
source: _employeeDataSource,
columns: getColumns,
columnSizer: _customColumnSizer,
columnWidthMode: ColumnWidthMode.auto),
);
}
class EmployeeDataSource extends DataGridSource {
…
@override
DataGridRowAdapter? buildRow(DataGridRow row) {
return DataGridRowAdapter(
cells: row.getCells().map<Widget>((dataGridCell) {
return Container(
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
dataGridCell.value.toString(),
style: const TextStyle(fontWeight: FontWeight.bold),
softWrap: false,
));
}).toList());
}
}
在 ColumnSizer 中:
class CustomColumnSizer extends ColumnSizer {
@override
double computeHeaderCellWidth(GridColumn column, TextStyle style) {
style = const TextStyle(fontWeight: FontWeight.bold);
return super.computeHeaderCellWidth(column, style);
}
@override
double computeCellWidth(GridColumn column, DataGridRow row, Object? cellValue,
TextStyle textStyle) {
textStyle = const TextStyle(fontWeight: FontWeight.bold);
return super.computeCellWidth(column, row, cellValue, textStyle);
}
}
示例链接:https://www.syncfusion.com/downloads/support/directtrac/general/ze/main-621685425
此外,我们已经在 UG 文档中提供了示例。请仔细检查一下,
我们希望这会有所帮助。如果您需要任何进一步的帮助,请告诉我们。
关于Flutter:SfDataGrid 自动宽度列似乎无法按照文档工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73053844/
我正在 csv 上使用 hadoop 来分析一些数据。我使用sql/mysql(不确定)来分析数据,现在陷入了僵局。 我花了好几个小时在谷歌上搜索,却没有找到任何相关的东西。我需要一个查询,在该查询中
我正在为 Bootstrap 网格布局的“简单”任务而苦苦挣扎。我希望在大视口(viewport)上有 4 列,然后在中型设备上有 2 列,最后在较小的设备上只有 1 列。 当我测试我的代码片段时,似
对于这个令人困惑的标题,我深表歉意,我想不出这个问题的正确措辞。相反,我只会给你背景信息和目标: 这是在一个表中,一个人可能有也可能没有多行数据,这些行可能包含相同的 activity_id 值,也可
具有 3 列的数据库表 - A int , B int , C int 我的问题是: 如何使用 Sequelize 结果找到 A > B + C const countTasks = await Ta
我在通过以下功能编写此查询时遇到问题: 首先按第 2 列 DESC 排序,然后从“不同的第 1 列”中选择 只有 Column1 是 DISTINCT 此查询没有帮助,因为它首先从第 1 列中进行选择
使用 Bootstrap 非常有趣和有帮助,目前我在创建以下需求时遇到问题。 “使用 bootstrap 在桌面上有 4 列,在平板电脑上有 2 列,在移动设备上有 1 列”谁能告诉我正确的结构 最佳
我是 R 新手,正在问一个非常基本的问题。当然,我在尝试从所提供的示例中获取指导的同时做了功课here和 here ,但无法在我的案例中实现这个想法,即可能是由于我的问题中的比较维度更大。 我的实
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个 df , delta1 delta2 0 -1 2 0 -1 0 0 0 我想知道如何分配 delt
您好,我想知道是否可以执行以下操作。显然,我已经尝试在 phpMyAdmin 中运行它,但出现错误。也许还有另一种方式来编写此查询。 SELECT * FROM eat_eat_restaurants
我有 2 个列表(标题和数据值)。我想要将数据值列 1 匹配并替换为头文件列 1,以获得与 dataValue 列 1 和标题值列 2 匹配的值 头文件 TotalLoad,M0001001 Hois
我有两个不同长度的文件,file2 是一个很大的引用文件,我从中提取文件 1 的数据。 我有一行 awk,我通常会对其进行调整以在我的文件中进行查找和替换,但它总是在同一列中进行查找和替换。 所以对于
假设我有两个表,如下所示。 create table contract( c_ID number(1) primary key, c_name varchar2(50) not
我有一个带有 varchar 列的 H2 表,其检查约束定义如下: CONSTRAINT my_constraint CHECK (varchar_field <> '') 以下插入语句失败,但当我删
这是最少量的代码,可以清楚地说明我的问题: One Two Three 前 2 个 div 应该是 2 个左列。第三个应该占据页面的其余部分。最后,我将添加选项来隐藏和
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我有一个包含 28 列的数据库。第一列是代码,第二列是名称,其余是值。 public void displayData() { con.Open(); MySqlDataAdapter
我很沮丧:每当我缩小这个网页时,一切都变得一团糟。我如何将网页居中,以便我可以缩小并且元素不会被错误定位。 (它应该是 2 列,但所有内容都合并为 1)我试过 但由于某种原因,这不起作用。 www.o
我是一名优秀的程序员,十分优秀!