栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

了解Flutter渲染引擎

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

了解Flutter渲染引擎

Flutter不仅由Widget组成。

调用时

setState
,将 Widget 标记为脏。但是,此小部件实际上并不是您在屏幕上渲染的。存在用于创建/
更改RenderObject的小部件;这些RenderObjects在屏幕上绘制内容。

RenderObject和Widget之间的链接是使用一种新型的Widget完成的:RenderObjectWidget(例如LeafRenderObjectWidget)

Flutter提供的大多数小部件在某种程度上都是RenderObjectWidget,包括ListView。

一个典型的RenderObjectWidget示例是这样的:

class MyWidget extends LeafRenderObjectWidget {  final String title;  MyWidget(this.title);  @override  MyRenderObject createRenderObject(BuildContext context) {    return new MyRenderObject()      ..title = title;  }  @override    void updateRenderObject(BuildContext context, MyRenderObject renderObject) {      renderObject        ..title = title;    }}

本示例使用小部件创建/更新RenderObject。仅仅通知框架还有一些东西需要重画。

要进行RenderObject重绘,必须调用

markNeedsPaint
markNeedsLayout
在所需的renderObject上进行。

通常这是由RenderObject本身使用自定义字段设置器通过以下方式完成的:

class MyRenderObject extends RenderBox {  String _title;  String get title => _title;  set title(String value) {    if (value != _title) {      markNeedsLayout();      _title = value;    }  }}

请注意

if (value != previous)

此检查可确保在不更改任何内容的情况下重建窗口小部件时,Flutter不会重新布局/重新绘制任何内容。

正是由于这种确切的条件,突变

List
Map
没有重新
ListView
渲染。它基本上具有以下内容:

List<Widget> _children;List<Widget> get children => _children;set children(List<Widget> value) {  if (value != _children) {    markNeedsLayout();    _children = value;  }}

但它意味着,如果 发生变异 的名单,而不是创建一个新的,在渲染对象不会被标记为需要重新布局/重绘。因此,将不会有任何视觉更新。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437265.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号