没有使用GlobalKeys的WidgetsBindingObserver mixin,是否可以观察组件的度量标准变化?

时间:2019-05-01 14:43:06

标签: dart flutter observers

我正在编写用于flutter的叠加包,以进行教程演练。

为了知道覆盖层上要打出哪些孔以使其后面的小部件完全可见,该功能需要一个全局键列表,我使用它们来获取位置和大小。

当覆盖层仍然可见时,可以对小部件进行动画处理并将其移动到其他位置。有没有一种方法可以检测到以便重新绘制叠加层?

我知道,如果我将WidgetsBindingObserver的混合添加到小部件,则可以使用didChangeMetrics()进行检查。问题是我不希望用户修改的是原始代码。有没有办法在不更改其代码的情况下观察小部件度量标准?

我的代码在https://github.com/kfirufk/tuxin_tutorial_overlay

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,感谢@pskink的大力支持,我得以正确解决此问题。

我已经具有要监视其大小和位置变化的小部件的全局键,因此无需深入查看应用程序中的所有小部件。

所以我要添加一个持久帧回调,然后在其中检查所显示的叠加层实际上是否有孔以在其后面显示小部件,如果确实如此,ת我使用_sizeVisitor()函数来检测是否有任何窗口小部件的位置或大小(如果修改了,如果它们在哪里,我会重画窗口小部件。)

再次..非常感谢@pskink!

void _detectWidgetPositionNSizeChange() {
  var bindings = WidgetsFlutterBinding.ensureInitialized();
  bindings.addPersistentFrameCallback((d) {
    if (visibleOverlayPage != null &&
        (visibleOverlayPage.disabledVisibleWidgetsCount +
                visibleOverlayPage.enabledVisibleWidgetsCount >
            0)) {
      for (final widgetGlobalKey in visibleOverlayPage.widgetsGlobalKeys) {
        if (_sizeVisitor(widgetGlobalKey)) {
          redrawCurrentOverlay();
          break;
        }
      }
    }
  });
}

bool _sizeVisitor(GlobalKey elementKey) {
  if (elementKey.currentContext != null) {
    final RenderBox renderBox = elementKey.currentContext.findRenderObject();
    bool isChanged = false;
    Rect newRect = renderBox.localToGlobal(Offset.zero) & renderBox.size;
    _rectMap.update(elementKey, (oldRect) {
      if (newRect != oldRect) {
        isChanged = true;
      }
      return newRect;
    }, ifAbsent: () => newRect);
    return isChanged;
  } else {
    return false;
  }
}