一、RenderObject定義
官方定義,RenderObject : An object in the render tree.即渲染樹中的一個對象,負責布局及繪制。
二同窘、Widget 、Element 部脚、RenderObject 關系
三樹圖.png
Widget 描述 Element 的配置信息想邦,是 Flutter 框架里的核心類層次結構,一個 Widget 是用戶界面某一部分的不可變描述委刘。Widgets 可以轉為 Elements丧没,Elements 管理著底層的渲染樹鹰椒。
- Widget實際上就是Element的配置數(shù)據(jù),Widget樹實際上是一個配置樹呕童,而真正的UI渲染樹是由Element構成漆际。Widget只是描述顯示元素的一個配置數(shù)據(jù),真正代表屏幕上顯示元素的類是Element夺饲。一個Widget對象可以對應多個Element對象奸汇。(相同的widget可以同時存在)
- UI樹由一個個獨立的Element節(jié)點構成。組件最終的顯示往声、渲染都是通過RenderObejct來完成的擂找,
- 從創(chuàng)建到渲染的大體流程是:根據(jù)Widget生成Element,然后創(chuàng)建相應的RenderObejct并關聯(lián)到Element.renderObject屬性上浩销,最后再通過RenderObject來完成布局排列和繪制贯涎。他們的依賴關系是:Element樹根據(jù)Widget樹生成,而渲染樹又依賴于Element樹慢洋。
三柬采、利用RenderObject獲取widget定位
我們可以知道最終頁面的顯示、渲染是根據(jù)renderObject來確定的且警,所以可以利用renderObject的屬性findRenderObject()來獲取widget的定位坐標。
1.給需要定位的組件添加GlobalKey
GlobalKey _globalKey = new GlobalKey();
TextField(
key: _globalKey,
style: TextStyle(
fontSize: 15.0,
color: Colors.black),
textInputAction: TextInputAction.next,
)
2.獲取組件坐標
RenderBox renderObject = _globalKey.currentContext.findRenderObject();
var offset = renderBox.localToGlobal(Offset.zero); //組件坐標
var underOffset = renderBox.localToGlobal(Offset(0.0, renderBox.size.height)); //組件下方坐標
var coordinate_x=offset.dx; //x坐標
var coordinate_y=offset.dy; //y坐標