美文网首页
Flutter介绍

Flutter介绍

作者: senpaiLi | 来源:发表于2020-12-02 16:59 被阅读0次
    一、什么是flutter

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。

    跨平台的几种方案:
    1、cordova为例的web应用(微信小程序)



    2、原生绘制,如rn、weex



    JavaScript通过 bridge 传递到native完成原生绘制, UI的渲染是很频繁的,要使UI不卡顿,必须达到60Fps。但是桥接会花一定的时间。所以这样的架构有时候会有性能问题。
    3、Flutter

    使用底层引擎渲染视图:Skia,省去了转换为原生控件的流程

    跨端对比:(RN和Flutter,数据来自闲鱼)
    1、Flutter在低端和中端的iOS机型上,FPS的表现都优于RN
    2、CPU方面,Flutter在低端机上表现差于RN,中端优于RN
    3、内存方面,低端机Flutter和RN表现几乎一致,但是中端机型上会多余30MB的内存(分析为Dart VM的内存)

    Flutter框架:



    跨平台应用的框架,没有使用WebView或者系统平台自带的控件,使用自身的高性能渲染引擎(Skia)自绘,
    界面开发语言使用dart,底层渲染引擎使用C, C++
    组合大于继承,控件本身通常由许多小型、单用途的控件组成,结合起来产生强大的效果,类的层次结构是扁平的,以最大化可能的组合数量

    二、Widget介绍

    StatefullWidget vs StatelessWidget

    一棵完整的Widget树:


    在 Flutter 体系结构中,真正做组件渲染在屏幕上这个任务的并非在 控件层(Widget)层,而是在渲染(Rendering)层。Flutter 中又引入了 Element 树和 RenderingObject 树两棵树。

    创建树:


    Widget&Element&RenderObject
    Widget 是应用界面的声明信息。Widget树实际上是一个配置树,Widget一般来说是不可变的immutable
    Element 链接 Widget 和 RenderObject,管理界面的更新和修改。
    RenderObject 保存具体的布局信息,负责绘制 UI。

    更新树:
    为什么widget都是immutable?
    flutter界面开发是一种响应式编程,主张simple is fast,flutter设计的初衷希望数据变更时发送通知到对应的可变更节点(可能是一个StatefullWidget子节点,也可以是rootWidget),由上到下重新create widget树进行刷新,这种思路比较简单,不用关心数据变更会影响到哪些节点。

    widget重新创建,element树和renderObject树是否也重新创建?
    widget只是一个配置数据结构,创建是非常轻量的,加上flutter团队对widget的创建/销毁做了优化,不用担心整个widget树重新创建所带来的性能问题,但是renderobject就不一样了,renderobject涉及到layout、paint等复杂操作,是一个真正渲染的view,整个view 树重新创建开销就比较大,所以答案是否定的。

    树的更新规则:
    找到widget对应的element节点,设置element为dirty,触发drawframe, drawframe会调用element的performRebuild()进行树重建
    widget.build() == null, deactive element.child,删除子树,流程结束
    element.child.widget == NULL, mount 的新子树,流程结束
    element.child.widget == widget.build() 无需重建,否则进入流程5
    Widget.canUpdate(element.child.widget, newWidget) == true,更新child的slot,element.child.update(newWidget)(如果child还有子节点,则递归上面的流程进行子树更新),流程结束,否则转6
    Widget.canUpdate(element.child.widget, newWidget) != true(widget的classtype 或者 key 不相等),deactivew element.child,mount 新子树

    如何触发树更新:
    全局更新:调用runApp(rootWidget),一般flutter启动时调用后不再会调用
    局部子树更新, 将该子树做StatefullWidget的一个子widget,并创建对应的State类实例,通过调用state.setState() 触发该子树的刷新

    三、数据传输

    Flutter定义了三种不同类型的Channel,它们分别是

    BasicMessageChannel:用于传递字符串和半结构化的信息。
    MethodChannel:用于传递方法调用(method invocation)。
    EventChannel: 用于数据流(event streams)的通信。
    三种Channel之间互相独立,各有用途,但它们在设计上却非常相近。每种Channel均有三个重要成员变量:

    name: String类型,代表Channel的名字,也是其唯一标识符。
    messager:BinaryMessenger类型,代表消息信使,是消息的发送与接收的工具。
    codec: MessageCodec类型或MethodCodec类型,代表消息的编解码器。

    PlatformChannel:https://www.jianshu.com/p/39575a90e820
    外接纹理:https://juejin.cn/post/6844903662548942855

    相关文章

      网友评论

          本文标题:Flutter介绍

          本文链接:https://www.haomeiwen.com/subject/wgtywktx.html