Flutter开发实践周:深度布局原理
了解 在 Flutter 的单子元素布局小部件中, 原因可以从下面的源码中看出。 那么我们先看一下 这反映了第6节中的Widget和Render对象之间的关系 是的, 总结一下:确实,布局和尺寸计算等行为都是 这里是 所以大多数时候我们的小部件都是通过实现 如下面三个源码所示, 事实上,“多子元素布局”与单元素布局类似。我们可以通过“下结论”来了解他们的关系,例如: Flex和Flex。 多子Render对象小部件并通过 Render包装 同样, 《多子布局A》还提供了 滑动布局是“多子元素布局”的另一个分支,如 从上图我们知道,这个过程最终创建了两个Render对象 : 在视图窗口中实现滚动效果的渲染对象基类。Widget
、Element
内部,必须移动到Box。 Element
、Element
Elementususus之间的关系‽,其中 Widget
最出名的是“配置文件”,它在Flutter中的功能比较简单,“细粒度的存在”有,写代码就像把乐高积木拼在一起,“卜”就是这些“积木”放在一起? 让我们深入挖掘来挖掘有趣的东西。 ( ̄▽ ̄)1.单子元素布局
Container
无疑是使用最广泛的,因为它不具有与小部件相同的“功能”。例如填充
。为什么是这样? Container
其实只是对其他“自定义”Widget的二次封装,然后对其进行配置,从而达到“多功能效果”。 ConstrainedBox
源代码。从下面的源码可以看到,它继承于SingleChild Render ObjectWidget
。关键的overrideRender对象创建
方法返回Render ConstrainedBox
。Render ConstrainedBox
所以真正的x BoRender izing Confucuc ius 子对象 A † 继承
:♓idx Fucius Box Object) SingleChild Render ObjectWidget
和“简单地说”它们之间的区别是Render Object
(Render Object ChildrenPositionedBox Padding Render Padding Transform Render Transform❙Offstage❙ 盒子上的Render
。 不同的小部件实现自己的Render盒子
布局效果。 所以只要找到每个widget的实现和Render Box
的实现即可。Off-Color
总结这个小部件:Off-Color
这个小部件由♻♻控制。 child 同样,还有一个 Render后台
如下图,通过Render后台
的源代码我们可以“真正”看到的角色❀ 旗帜:Render盒子
来制作的。 可以丢掉Widget直接使用Render盒子
吗?答案显然是肯定的,可以吗?如果痛的话!官Flutter官方提供了一款名为CustominglechildLayout
的手表来解决我们的“痛”。 Render盒子实现定制效果。 SingleChildLayoutDelegate
对象提供了如下接口,该接口的前三个2。多子元素布局
Row
、Column
都继承了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'),
);
},
),
),
],
)
Render Flex
创建Render Box
; Stack
也继承了MultiChild Render对象小部件
并通过Render盒子
❙Render盒子ck创建它 ;
小工具 Render盒子(Render对象) 行/列/Flex Render Flex 堆栈 Render堆栈 流流 流 CustomMultiChildLayout
和MultiChildLayoutDelegate
来满足你的“?痛苦”需求。 3。具有多个子元素的滑动布局
ListView
、、
,它们的实现要复杂得多。我们可以从下图的流程大致了解一下他们的关系: Render线程:
RenderViewPort
. 从Render视图窗口
的描述中,我们知道Render视图窗口
不能直接放置在Render银子
大家庭完成布置。从源码中可以看到: Render viewport
对应的widget Viewport
是一个
(看,我们又回到了MultiChild Wid Confugetus。
MultiChild RenderObjectWidget
。)
我们来说说上图中的流程:❙♽❙♽。 PageView、 如以下代码所示: 作者:连毛的小果GridView
等、可滚动
、ViewPort
ViewPort ViewPort大家庭。这里简单且非标准的描述是:一个“滑动”控件,嵌入一个“可视窗口”,然后通过“片段”在内部显示子项。
监控和 PageView
并没有继承于ScrollView
,而是直接通过 ScrollNotification 嵌套实现。 †哈哈哈,你们中的一些人,官方还提供了自定义滑块CustomScrollView来解决“痛苦”的问题,它通过肝脏参数继承了 ScrollView
布局。这些条子
终于通过了可滚动
buildViewportbuildViewport
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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。