Flutter中的4颗树 2023-09-05 周二

2023-09-04  本文已影响0人  勇往直前888

Widget

4颗树

image.png

三棵树中,WidgetElement 是一一对应的,但并不和 RenderObject一一对应。比如 StatelessWidgetStatefulWidget都没有对应的RenderObject

StatefulWidget

abstract class StatefulWidget extends Widget {
  const StatefulWidget({ Key key }) : super(key: key);
    
  @override
  StatefulElement createElement() => StatefulElement(this);
    
  @protected
  State createState();
}

widget经常变,但是State一直是同一个,所以能保持状态。

image.png

initState只执行一次;build经常执行; 对应的Widget经常变;

通过Context获取State对象

Builder(builder: (context) {
  return ElevatedButton(
    onPressed: () {
      // 直接通过of静态方法来获取ScaffoldState
      ScaffoldState _state=Scaffold.of(context);
      // 打开抽屉菜单
      _state.openDrawer();
    },
    child: Text('打开抽屉菜单2'),
  );
}),

通过GlobalKey获取State对象

  1. 给目标StatefulWidget添加GlobalKey
//定义一个globalKey, 由于GlobalKey要保持全局唯一性,我们使用静态变量存储
static GlobalKey<ScaffoldState> _globalKey= GlobalKey();
...
Scaffold(
    key: _globalKey , //设置key
    ...  
)
  1. 通过GlobalKey来获取State对象
_globalKey.currentState.openDrawer()

通过 RenderObject 自定义 Widget

类似原生开发的画界面,就要通过RenderObject实现

class CustomWidget extends LeafRenderObjectWidget{
  @override
  RenderObject createRenderObject(BuildContext context) {
    // 创建 RenderObject
    return RenderCustomObject();
  }
  @override
  void updateRenderObject(BuildContext context, RenderCustomObject  renderObject) {
    // 更新 RenderObject
    super.updateRenderObject(context, renderObject);
  }
}

class RenderCustomObject extends RenderBox{

  @override
  void performLayout() {
    // 实现布局逻辑
  }

  @override
  void paint(PaintingContext context, Offset offset) {
    // 实现绘制
  }
}
上一篇下一篇

猜你喜欢

热点阅读