• 竹之同学
    2019-07-18
    如果用 Vue 来比喻的话,Widget 就是 Vue 的 template;Element 就是 virtual DOM;RenderObject 就是DOM,不知道这种想法对不?

    作者回复: 赞

    
     20
  • 大土豆
    2019-07-19
    React:JSX->虚拟DOM->浏览器DOM
    React Native:JSX->虚拟DOM->Android/iOS原生控件
    flutter:Widget->Element(类似虚拟DOM,只是一种数据结构)-> RenderObject 交给底层渲染

    作者回复: 赞

     1
     10
  • KrystalJake
    2019-07-18
    您好:
    我看有的文档(flutter in action)会说一个Widget会对应多个Element,因为Element是根据Widget创建的,您的分享里说一个渲染点对应可能对应多个Widget,还是不太理解Widget,Element,RenderObject之间的关系,什么情况下一对一,一对多或多对一,希望能详细讲解一下,谢谢

    作者回复: Element是可复用的,只要Widget前后类型一样。比如Widget是蓝色的,重建后变红色了,Element是会复用的。所以是多个Widget(销毁前后)会对应一个Element

     1
     7
  • puppy_love
    2019-07-19
    flutter渲染原理相关文章看了太多了,但是大部分都是根据图一的flutter架构图重复描述(就好像Android的架构图反复叙述没有意义),刚开始看到这张图的时候以为又是一篇雷同文章,没想到后面的阐述这么清晰生动,让我对flutter的渲染原理有了一个立体的理解,也对flutter更有信心了
    
     6
  • 加温后的啤酒
    2019-07-22
    在iOS中,UIView相当于Element,CALayer相当于renderObject。 老师 我的理解对吗?

    作者回复: 可以这么理解

    
     5
  • Longwei243
    2019-07-18
    listview想要通过代码滑动到某个item有什么办法吗?item的高度都是不固定的

    作者回复: ScrollController确实还不支持,可以关注下这个issue:https://github.com/flutter/flutter/issues/12319

    
     2
  • 丁某某
    2019-07-18
    flutter 将Widget设计成不可变,怎么理解?

    作者回复: 变了就销毁重建

    
     2
  • Keep-Moving
    2019-07-18
    文中提到的绘制和渲染的区别是什么呢?

    作者回复: 绘制侧重绘图命令(GPU前),渲染侧重最终呈现(GPU后)

    
     2
  • MaO
    2019-12-29
    如果 Widget 的配置数据发生了改变,那么持有该 Widget 的 Element 节点也会被标记为 dirty。在下一个周期的绘制时,Flutter 就会触发 Element 树的更新,并使用最新的 Widget 数据更新自身以及关联的 RenderObject 对象

    -----?
    这个知识点有更详细的参考资料吗?
    
     1
  • Tony
    2019-09-14
    Element 则是 Widget 的一个实例化对象是什么含义

    作者回复: 两层意思:1.表示Widget是一个配置,Element才是最终的对象;2.Element是通过遍历Widget树时,调用Widget的方法创建的

    
     1
  • mαnajay
    2019-07-24
    我想问下 flutter 关于GPU 离屏渲染 这块有和iOS之类的不一样的地方吗?
    比如圆角 ,阴影, mask ,不透明多层合并 等 处理

    作者回复: 这块RenderObject帮你自动做了,一般情况下不需要管这么底层的渲染机制。

    
     1
  • davidzhou
    2019-07-22
    在iOS里面UIKit的UIView,对应widget,core animation的CALayer对应element,core graphics的context对应renderobject,不知道有没有理解到位

    作者回复: UIKit其实没有widget这一层

    
     1
  • Jersey、
    2020-02-04
    下面是自己读这篇文章过程时,产生的疑问和思考之后得出的论述, 不知道是否合理。
    疑问:
    1. Widget 不可变的设计原因?
    2. 为什么需要引入 Element , 并将其设计成可变性来解决 Widget 重建和销毁带来的性能消耗?
    3. Widget 与 Element 是如何配合工作的, 来降低视图更新带来性能消耗?
    论述:
    Widget 是一颗不可变的模型树
    Element 是一颗可变的中间层树, 它才是真正会影响到 RenderObject(最终渲染树)结果的数据

    Element 的出现主要是为了降低 Widget 树改变时需要消耗和重建而直接导致 RenderObject 树的变化, 也需要面临重建和销毁的性能影响。
    在引入 Element 树之前, 当 Widget 需要改变时,由于其不可变性需要经过销毁和重建, 然后直接触发 RenderObject 树的更新, 对于性能来说这样损耗相对较大。
    在引入了 Element 树之后, 当 Widget 需要改变时, 其必须要经过销毁和重建的过程(但是其又是比较轻量级的数据类型, 在性能权衡方面做取舍是非常正确的), 这点也充分体现了将 Widget 设计成不可变的依据。
    由于 Element 树的存在, 直到 Widget 完成重建销毁过程之后, 其会对原有 Element 进行 Diff, 然后在对 Diff 结果进行最低程度修改的方式,去更新 RenderObject 这颗真是渲染树, 这样以来相对未引入 Element 树的设计要优秀很多。

    展开
    
    
  • 樊不烦
    2020-01-16
    在iOS中,感觉没有Widget对应的概念,它更像是每个UIView控件中的属性,而Element就相当于UIView,RenderObject就像是CALayer。因为Widget是只读的所以当我们修改某一属性的时候就会重新生成一个Widget,然后在对应的Element中去更新,就相当于更新UIView中的属性,然后在通过RenderObject也就是类似于CALayer的去重新计算和布局。请问老师不知道我理解的是否有偏差
    
    
  • 满大大
    2019-11-20
    RenderObjectWidget 本身并不负责这些对象的创建与更新,拿它有啥用啊

    作者回复: RenderObjectWidget是渲染的起点,也是这些对象的载体啊。它自己不负责他们的创建和更新,但是提供了创建和更新的方法让框架在合适的时机调用

    
    
  • outman
    2019-10-30
    请教个问题。RenderObjectWidget是通过RenderObject来进行布局绘制。那么继承StatefulWidget/StatelessWidget的,是怎么进行布局绘制的呢,他们会创建ComponentElement,而不是RenderObjectElement,好像不会创建RenderObject。

    作者回复: 交给build中返回的那个Widget去做布局/绘制

    
    
  • xuelian
    2019-10-17
    举个例子,我准备写自定义的navagationBar,开始用的bottomBar,他的children需要是Widget.Flutter中的Button是不带文字+图片的,所以想到用navagationBarItem.但是报错了,说type不是Widget.这在iOS中他们都是UIView,这说明Widget不是单纯对应View.总的来说他是一个狭义上的“对象”,如老师上面说一切皆Widget,和React的一切皆组件一样,都是被特殊定义的“对象”.
    
    
  • 欢乐的小马驹
    2019-10-13
    iOS中,大部分情况没有Widhet。但是NavigationBar对应Element,NavigationBarItem对应Widget。可以这样理解吗?老师

    作者回复: 按照这个标准他俩对应Element更合适

    
    
  • 雷声大
    2019-10-04
    Flutter UI的理念更偏向前端框架, 终端从来没这么搞过
    
    
  • 夜色下云淡风轻
    2019-09-02
    有界面的Widget会生成Element,Element生成对应的RenderObject进行实际的布局绘制工作;而如果没有界面就不会生成Element自然也就没有RenderObject,Element和RenderObject必定是对应的这样理解对吗?

    作者回复: 大部分对;Element主要是做复用判断的,所以每个Widget都有Element,RenderObject只有可视的控件才有

    
    
我们在线,来聊聊吧