我正在尝试获取一个数据表,该数据表太大,屏幕无法在 Windows 平台上滚动。主要代码如下:
import '../../imports.dart';
class TablicaTermina extends StatefulWidget {
final List frizeri;
const TablicaTermina({super.key, required this.frizeri});
@override
State<TablicaTermina> createState() => _TablicaTerminaState();
}
class _TablicaTerminaState extends State<TablicaTermina> {
// Scroll
ScrollController horizontalController = ScrollController();
ScrollController verticalController = ScrollController();
double totalDeltaX = 0.0;
double totalDeltaY = 0.0;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(left: 15, right: 15, bottom: 10),
child: Column(
children: [
Row(children: [
DataTable(
border: TableBorder(
horizontalInside:
BorderSide(color: Colors.red.withOpacity(0.5))),
columns: const [
DataColumn(
label: Text("data",
style: TextStyle(color: Colors.transparent)))
],
rows: const []),
DataTable(
columns: List<DataColumn>.generate(
widget.frizeri.length,
(index) => DataColumn(
label: Text(
widget.frizeri[0][1],
style: const TextStyle(color: Colors.white),
))),
rows: const []),
]),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: [
DataTable(
headingRowHeight: 0,
columns: const [DataColumn(label: Text(""))],
rows: List<DataRow>.generate(
widget.frizeri.length * 3,
(index) => const DataRow(cells: [
DataCell(Text(
"Nig,",
style: TextStyle(color: Colors.amberAccent),
))
])),
),
GestureDetector(
onPanUpdate: (details) {
handleMouseMoveScroll(details);
},
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
controller: verticalController,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: horizontalController,
child: DataTable(
headingRowHeight: 0,
columns: List<DataColumn>.generate(
widget.frizeri.length * 3,
(index) => DataColumn(
label: Text(
widget.frizeri[0][1],
style: const TextStyle(
color: Colors.transparent),
))),
rows: List<DataRow>.generate(
widget.frizeri.length * 3,
(int rowIndex) => DataRow(
cells: List<DataCell>.generate(
widget.frizeri.length * 3,
(int cellIndex) => const DataCell(
SizedBox(
child: Text("Bok",
style: TextStyle(
color: Colors.white,
))),
),
),
),
),
),
),
),
),
],
),
),
],
),
);
}
/* void handleMouseMoveScroll(DragUpdateDetails details) {
setState(() {
totalDeltaX += details.delta.dx;
totalDeltaY += details.delta.dy;
});
/* double noviHorizontalOffset = totalDeltaX;
double noviVerticalOffset = totalDeltaY;
print("NoviHorizontalOffset before clamp: $noviHorizontalOffset");
print("NoviVerticalOffset before clamp: $noviVerticalOffset"); */
/* // Clamp the offsets to prevent scrolling beyond limits
noviHorizontalOffset = noviHorizontalOffset.clamp(
0.0, horizontalController.position.maxScrollExtent);
noviVerticalOffset = noviVerticalOffset.clamp(
0.0, verticalController.position.maxScrollExtent); */
/* print("NoviHorizontalOffset after clamp: $noviHorizontalOffset");
print("NoviVerticalOffset after clamp: $noviVerticalOffset"); */
horizontalController.jumpTo(totalDeltaX);
verticalController.jumpTo(totalDeltaY);
} */
void handleMouseMoveScroll(DragUpdateDetails details) {
setState(() {
totalDeltaX -= details.delta.dx;
totalDeltaY -= details.delta.dy;
});
print(totalDeltaX);
horizontalController.jumpTo(totalDeltaX);
}
}
问题在于第二行()内的第二个数据表。它由两个滚动方向相反的 SingleChildScrollView 包裹。它们被 GestureDetector 包裹着,并且正在监听
pan
。这使我能够拖动表格,以便我可以看到所有信息。目前它太大了,我只能看到其中的一部分:
拖动桌子时移动,但如果我停止移动或松开鼠标,它会自动返回到起始位置。我将最后一个位置保存在totalDeltaX/Y 变量中,当我再次开始拖动时,它会从该位置开始,但如果我不移动光标,它只会显示起始位置。这是问题的视频:
我尝试了很多totalIndex 和details 值的组合,但似乎都不起作用。我设法从最后一个位置开始拖动,但它仍然回到起始位置,如 GIF 所示。
谢谢 pskink 的回答。这是一种解决方法,但可以完成工作。这是他的回答: 为什么不使用 pub.dev/packages/two_Dimension_scrollables 中的 TableView ?一些示例代码:gist.github.com/pskink/938eb446f1c614bc864e16352aa1f903