【问题标题】:Flutter context.findRenderObject() returns nullFlutter context.findRenderObject() 返回 null
【发布时间】:2021-06-14 06:12:35
【问题描述】:

我正在尝试根据小部件的大小进行一些手势运动逻辑。

为了获取大小,我在构建方法中调用了以下代码...

final RenderBox renderBox = context.findRenderObject();

这有时会返回 null?

是什么导致它返回 null?有没有更可靠的方法来获取 Widget 的大小?

【问题讨论】:

  • 你给我的例子可以工作,但对于更高级的运动跟踪,我需要编写一个自定义类来封装要通知的额外数据(位置、上/下/拖动等)。此外,我必须在 CustomPainter 类中维护运动状态,并在 paint() 方法中执行运动逻辑。我只是希望有一个更优雅的解决方案。也许没有……
  • 所以使用LayoutBuilder 但老实说,当您知道画布大小时,我不知道它对您有何帮助-无论如何,在GestureDetector 检测到任何事件后,您都需要与CustomPaint 交互-您如何想这样做吗?
  • CustomPaint 和 GestureDetector 的公共父有状态小部件维护状态,GestureDetector 回调调用 setState。然后更改会反映在 CustomPaint 中。
  • 因此,在检测到任何事件后,您将从头开始重建您的CustomPainer - 例如,如果您有onPanUpdate,您的CustomPainter 将每秒重建 20-30 次或更多次
  • 是的,这就是我目前的做法。对我来说,基于我过去使用的框架,以及基于 Flutter 暴露的类,对我来说这样做的正确方法并不明显。

标签: flutter dart widget


【解决方案1】:

您需要确保小部件当前正在渲染(例如,在屏幕上),或者在尝试访问它之前给它一个渲染时间,例如,如果这是来自有状态的小部件:

WidgetsBinding.instance.addPostFrameCallback(() {
   final RenderBox renderBox = context.findRenderObject();
});

【讨论】:

  • 我需要 Widget 的 build 方法中的尺寸。这对它不起作用吗?
  • 如果它是动态的,在绘制它之前你不能拥有size。但是您可以在第一帧之后拥有它,这意味着您最多在获得大小之前会丢失一帧。
猜你喜欢
  • 2020-08-23
  • 2021-09-28
  • 2020-11-10
  • 2020-07-12
  • 2021-04-19
  • 2021-06-29
  • 2020-12-29
  • 2019-11-22
  • 2021-01-17
相关资源
最近更新 更多