widgit与element是一对多关系
https://www.freesion.com/article/4959804840/
在mount方法中根据child Widget循环创建element
在这里着重说一下RenderObjectWidget,看下表:
Widget 说明 举例
MultiChildRenderObjectWidget 该类型的Widget可以添加多个widget Row,Column,Stack
SingleChildRenderObjectWIdget 该类型的widget只能添加一个widget Center,Padding,Container
LeafRenderObjectWidget 该类型是树的叶子节点,故不能添加widget Text,Image,Semantics
image.png
void mount(Element parent, dynamic newSlot) {
super.mount(parent, newSlot);
_children = List<Element>(widget.children.length);
Element previousChild;
for (int i = 0; i < _children.length; i += 1) {
final Element newChild = inflateWidget(widget.children[i], previousChild);
_children[i] = newChild;
previousChild = newChild;
}
}
原生交互
FlutterMethodCahnnel
调用方法,一次通讯
以下两种是持续通讯
FlutterBaseMessageChannel
传递字符,半结构化的信息
需要解码器
FlutterChannelEvent
用于数据流(Stream)的通讯
:super(key key)的作用,避免UI增量更新混乱(把参数写在state时出现,或者key值一样),
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
局部更新
_globalKey.currentState.data =
'old:' + _globalKey.currentState.count.toString();
_globalKey.currentState.count++;
_globalKey.currentState.setState(() {});
网友评论