ScrollController.jumpTo() 在使用 GestureDetectors pan 结束手势后返回到起始位置

问题描述 投票:0回答:1

我正在尝试获取一个数据表,该数据表太大,屏幕无法在 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 所示。

flutter windows gesture
1个回答
0
投票

谢谢 pskink 的回答。这是一种解决方法,但可以完成工作。这是他的回答: 为什么不使用 pub.dev/packages/two_Dimension_scrollables 中的 TableView ?一些示例代码:gist.github.com/pskink/938eb446f1c614bc864e16352aa1f903

© www.soinside.com 2019 - 2024. All rights reserved.