-
PaintingContext
的关键是 A place to paint ,同时它在父类ClipContext
是包含有Canvas
,并且PaintingContext
的构造方法是@protected
,只在PaintingContext.repaintCompositedChild
和pushLayer
时自动创建。 -
Offset
在paint
中主要是提供当前控件在屏幕的相对偏移值,提供绘制时确定绘制的坐标。
OK,继续往下走,那么既然 PaintingContext
叫 Context ,那它肯定是存在上下文关系,那它是在哪里开始创建的呢?
通过调试源码可知,项目在 runApp
时通过 WidgetsFlutterBinding
启动,而在以前的篇幅中我们知道, WidgetsFlutterBinding
是一个“胶水类”,它会触发 mixin 的 RendererBinding
,如下图创建出根 node 的 PaintingContext
。
好了,那么Offset
呢?如下图,对于 Offset
的传递,是通过父控件和子控件的 offset 相加之后,一级一级的将需要绘制的坐标结合去传递的。
目前简单来说,通过 PaintingContext
和 Offset
,在布局之后我们就可以在屏幕上准确的地方绘制会需要的画面。
1、测试绘制
这里我们先做一个有趣的测试。
我们现在屏幕上通过 Container
限制一个高为 60 的绿色容器,如下图,暂时忽略容器内的 Slider
控件 ,我们图中绘制了一个 100 x 100 的红色方块,这时候我们会看到下图右边的效果是:纳尼?为什么只有这么小?
事实上,因为正常 Flutter 在绘制 Container
的时候,AppBar
已经帮我们计算了状态栏和标题