我在使用平移更新来获取手势检测器小部件上的实际本地位置时遇到问题

这是我的示例代码

new Center(
  child new Container(
       height: 150.0,
       width: 150.0,
       decoration: new BoxDecoration(
         borderRadius: new BorderRadius.circular(5.0),
         color: Colors.white,
      ),
      child: new GestureDetector(
      onPanUpdate: (details) => onPanUpdate(context, details),
      child: new CustomPaint(
         painter: new MyPainter(
             points: points,
             limitBottom:height - 125.0,
             limitTop: 10.0,
             limitLeft: 5.0,
             limitRight: width - 55.0
         ),
       ),
    ),
  ),
)

当我打印全局位置和本地位置的偏移量时,它们两个都具有相同的值。结果是它被绘制在我的Container小部件外部。我有什么想得到本地人的位置的东西吗?

最佳答案

我假设您正在使用类似这样的方法来获取本地位置:

RenderBox getBox = context.findRenderObject();
var local = getBox.globalToLocal(start.globalPosition);

执行此操作后偏移量错误的原因与您用来查找本地位置的context有关。

如果您使用的是整个窗口小部件的上下文,则实际上,您要做的是计算整个窗口小部件内的偏移量。 IE。
YourWidget <-- context
  Center
   Container
     GestureDetector
     ...

假设屏幕看起来像这样:
1__________________________
|                          |  <--- YourWidget
|       2_________         |
|       | gesture |        |
|       | detector|        |
|       |   3.    |        |
|       |_________|        |
|                          |
|__________________________|

其中1是整个小部件(和屏幕)的左上角,2是手势检测器的左上角,3是您点击的点。

通过使用YourWidget的上下文,您将基于1和3之间的差异来计算分接头的位置。如果1恰好位于屏幕的左上方,则结果将与全局坐标相匹配。

通过将上下文用于手势检测器,您可以测量2到3之间的距离,这将为您提供所需的偏移量。

有两种方法可以解决此问题-您可以将GestureDetector包装在Builder小部件中,或者可以创建仅封装GestureDetector的新的有状态/无状态小部件。我个人建议创建一个新的小部件。

关于dart - flutter : Get Local position of Gesture Detector,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52000130/

10-12 15:33