Flutter开发实践周:深度布局原理
了解 在 Flutter 的单子元素布局小部件中, 原因可以从下面的源码中看出。 那么我们先看一下 这反映了第6节中的Widget和Render对象之间的关系 是的, 总结一下:确实,布局和尺寸计算等行为都是 这里是 所以大多数时候我们的小部件都是通过实现 如下面三个源码所示, 事实上,“多子元素布局”与单元素布局类似。我们可以通过“下结论”来了解他们的关系,例如: Flex和Flex。 多子Render对象小部件并通过 Render包装 同样, 《多子布局A》还提供了 滑动布局是“多子元素布局”的另一个分支,如 从上图我们知道,这个过程最终创建了两个Render对象 : 在视图窗口中实现滚动效果的渲染对象基类。Widget、Element内部,必须移动到Box。 Element、ElementElementususus之间的关系‽,其中 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等、可滚动、ViewPortViewPort 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前端网发表,如需转载,请注明页面地址。
code前端网



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