Code前端首页关于Code前端联系我们

Flutter开发实践周:深度布局原理

terry 2年前 (2023-09-23) 阅读数 61 #移动小程序

了解WidgetElementElementElementElementususus之间的关系‽,其中 Widget 最出名的是“配置文件”,它在Flutter中的功能比较简单,“细粒度的存在”,写代码就像把乐高积木拼在一起,“卜”就是这些“积木”放在一起? 让我们深入挖掘来挖掘有趣的东西。 ( ̄▽ ̄)

1.单子元素布局

在 Flutter 的单子元素布局小部件中,Container 无疑是使用最广泛的,因为它不具有与小部件相同的“功能”。例如填充。为什么是这样?

原因可以从下面的源码中看出。 Container其实只是对其他“自定义”Widget的二次封装,然后对其进行配置,从而达到“多功能效果”。 Flutter开发实战七:深入布局原理

那么我们先看一下ConstrainedBox源代码。从下面的源码可以看到,它继承于SingleChild Render ObjectWidget。关键的overrideRender对象创建方法返回Render ConstrainedBox

这反映了第6节中的Widget和Render对象之间的关系

是的,Render ConstrainedBox所以真正的x BoRender izing Confucuc ius 子对象 A † 继承 SingleChild Render ObjectWidget和“简单地说”它们之间的区别是Render Object(Render Object:♓idx Fucius Box Object)

  • 对齐 ChildrenPositionedBoxPaddingRender PaddingTransformRender Transform❙Offstage❙

    总结一下:确实,布局和尺寸计算等行为都是盒子上的Render不同的小部件实现自己的Render盒子布局效果。 所以只要找到每个widget的实现和Render Box的实现即可。

    这里是Off-Color总结这个小部件:Off-Color这个小部件由

  • ♻♻控制。 child 同样,还有一个Render后台如下图,通过Render后台的源代码我们可以“真正”看到的角色❀ 旗帜:Flutter开发实战七:深入布局原理

    所以大多数时候我们的小部件都是通过实现Render盒子来制作的。 可以丢掉Widget直接使用Render盒子吗?答案显然是肯定的,可以吗?如果痛的话!官Flutter官方提供了一款名为CustominglechildLayout的手表来解决我们的“痛”。 Render盒子实现定制效果。 Flutter开发实战七:深入布局原理

    如下面三个源码所示,SingleChildLayoutDelegate对象提供了如下接口,该接口的前三个

    按照的顺序调用。通过实现该接口,您可以轻松控制Render盒子的布局位置、的大小等。Flutter开发实战七:深入布局原理Flutter开发实战七:深入布局原理Flutter开发实战七:深入布局原理

    2。多子元素布局

    事实上,“多子元素布局”与单元素布局类似。我们可以通过“下结论”来了解他们的关系,例如:

    • RowColumn都继承了
      CustomScrollView(
        slivers: <Widget>[
          const SliverAppBar(
            pinned: true,
            expandedHeight: 250.0,
            flexibleSpace: FlexibleSpaceBar(
              title: Text('Demo'),
            ),
          ),
          SliverGrid(
            gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
              maxCrossAxisExtent: 200.0,
              mainAxisSpacing: 10.0,
              crossAxisSpacing: 10.0,
              childAspectRatio: 4.0,
            ),
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) {
                return Container(
                  alignment: Alignment.center,
                  color: Colors.teal[100 * (index % 9)],
                  child: Text('grid item $index'),
                );
              },
              childCount: 20,
            ),
          ),
          SliverFixedExtentList(
            itemExtent: 50.0,
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) {
                return Container(
                  alignment: Alignment.center,
                  color: Colors.lightBlue[100 * (index % 9)],
                  child: Text('list item $index'),
                );
              },
            ),
          ),
        ],
      )

      Flex和Flex。 多子Render对象小部件并通过Render Flex创建Render Box

    • Stack也继承了MultiChild Render对象小部件并通过Render盒子❙Render盒子ck创建它 ;
    小工具Render盒子(Render对象)
    行/列/FlexRender Flex
    堆栈Render堆栈
    流流

    Render包装

    同样, 《多子布局A》还提供了CustomMultiChildLayoutMultiChildLayoutDelegate来满足你的“?痛苦”需求。

    3。具有多个子元素的滑动布局

    滑动布局是“多子元素布局”的另一个分支,如 ListView

    Flutter开发实战七:深入布局原理

    ,它们的实现要复杂得多。我们可以从下图的流程大致了解一下他们的关系: Flutter开发实战七:深入布局原理

    从上图我们知道,这个过程最终创建了两个Render对象 :

    • Render线程: Flutter开发实战七:深入布局原理

      在视图窗口中实现滚动效果的渲染对象基类。

    • RenderViewPort . 从Render视图窗口的描述中,我们知道Render视图窗口不能直接放置在
    内部,必须移动到Box。 Render银子大家庭完成布置。从源码中可以看到: Render viewport 对应的widget Viewport是一个MultiChild Wid Confugetus。 (看,我们又回到了MultiChild RenderObjectWidget。)

    我们来说说上图中的流程:❙♽❙♽。 PageView、GridView等、可滚动ViewPortViewPort ViewPort大家庭。这里简单且非标准的描述是:一个“滑动”控件,嵌入一个“可视窗口”,然后通过“片段”在内部显示子项

  • 不同的是PageView并没有继承于ScrollView,而是直接通过
  • 监控和
    ScrollNotification 嵌套实现。 †哈哈哈,你们中的一些人,官方还提供了自定义滑块​​CustomScrollView来解决“痛苦”的问题,它通过肝脏参数继承了ScrollView布局。这些条子终于通过了可滚动buildViewportbuildViewport
    Flutter开发实战七:深入布局原理

    如以下代码所示:

    CustomScrollView(
      slivers: <Widget>[
        const SliverAppBar(
          pinned: true,
          expandedHeight: 250.0,
          flexibleSpace: FlexibleSpaceBar(
            title: Text('Demo'),
          ),
        ),
        SliverGrid(
          gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
            maxCrossAxisExtent: 200.0,
            mainAxisSpacing: 10.0,
            crossAxisSpacing: 10.0,
            childAspectRatio: 4.0,
          ),
          delegate: SliverChildBuilderDelegate(
            (BuildContext context, int index) {
              return Container(
                alignment: Alignment.center,
                color: Colors.teal[100 * (index % 9)],
                child: Text('grid item $index'),
              );
            },
            childCount: 20,
          ),
        ),
        SliverFixedExtentList(
          itemExtent: 50.0,
          delegate: SliverChildBuilderDelegate(
            (BuildContext context, int index) {
              return Container(
                alignment: Alignment.center,
                color: Colors.lightBlue[100 * (index % 9)],
                child: Text('list item $index'),
              );
            },
          ),
        ),
      ],
    )

    作者:连毛的小果
    链接:https://juejin.im/post/5c8c6ef7e51d450ba7233f51
    来源:掘金。 作者版权所有商业转载请联系作者获得许可。非商业转载请注明来源。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门