- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有使用经验的人可以吗 CustomSingleChildLayout
和 CustomMultiChildLayout
类能够详细解释(通过示例)如何使用它们。
我是 Flutter 的新手,正在尝试了解如何使用这些。但是,文档很糟糕,而且不清楚。我试图在互联网上搜索示例,但没有任何其他文档。
如果您能提供帮助,我将永远感激不尽。
谢谢!
最佳答案
首先,我想说我很高兴能帮助你解决这个问题,因为我能理解你的挣扎 - 自己解决它也有好处(文档很棒)。
什么 CustomSingleChildLayout
在我解释之后,确实会很明显CustomMultiChildLayout
给你。
CustomMultiChildLayout
这个小部件的重点是让您布局您在单个函数中传递给此小部件的子项,即它们的位置和大小可以相互依赖,这是您无法使用例如预建 Stack
小部件。
CustomMultiChildLayout(
children: [
// Widgets you want to layout in a customized manner
],
)
children
必须是 LayoutId
然后将您实际想要作为 child 显示的小部件传递给该 LayoutId
. id
将唯一标识您的小部件,使其在布局时可以访问:CustomMultiChildLayout(
children: [
LayoutId(
id: 1, // The id can be anything, i.e. any Object, also an enum value.
child: Text('Widget one'), // This is the widget you actually want to show.
),
LayoutId(
id: 2, // You will need to refer to that id when laying out your children.
child: Text('Widget two'),
),
],
)
MultiChildLayoutDelegate
处理布局部分的子类。这里的文档似乎非常详细。 class YourLayoutDelegate extends MultiChildLayoutDelegate {
// You can pass any parameters to this class because you will instantiate your delegate
// in the build function where you place your CustomMultiChildLayout.
// I will use an Offset for this simple example.
YourLayoutDelegate({this.position});
final Offset position;
}
hasChild
,它可以让您检查特定的 id (还记得 LayoutId
吗?)被传递给 children
,即如果该 ID 的 child 存在。 layoutChild
,您需要为每个 调用它id , 每个 child ,只提供一次,它会给你 Size
那个 child 的。 positionChild
,它允许您从 Offset(0, 0)
更改位置到您指定的任何偏移量。 CustomMultiChildLayout
实现委托(delegate)。 :
class YourLayoutDelegate extends MultiChildLayoutDelegate {
YourLayoutDelegate({this.position});
final Offset position;
@override
void performLayout(Size size) {
// `size` is the size of the `CustomMultiChildLayout` itself.
Size leadingSize = Size.zero; // If there is no widget with id `1`, the size will remain at zero.
// Remember that `1` here can be any **id** - you specify them using LayoutId.
if (hasChild(1)) {
leadingSize = layoutChild(
1, // The id once again.
BoxConstraints.loose(size), // This just says that the child cannot be bigger than the whole layout.
);
// No need to position this child if we want to have it at Offset(0, 0).
}
if (hasChild(2)) {
final secondSize = layoutChild(
2,
BoxConstraints(
// This is exactly the same as above, but this can be anything you specify.
// BoxConstraints.loose is a shortcut to this.
maxWidth: size.width,
maxHeight: size.height,
),
);
positionChild(
2,
Offset(
leadingSize.width, // This will place child 2 to the right of child 1.
size.height / 2 - secondSize.height / 2, // Centers the second child vertically.
),
);
}
}
}
feature_discovery
写的一个真实世界的例子。包裹:
MultiChildLayoutDelegate
implementation和
CustomMultiChildLayout
in the build
method .
shouldRelayout
method , 简单控制是否
performLayout
应该通过与旧委托(delegate)进行比较,在任何给定时间点再次调用(可选地,您也可以覆盖
getSize
)并将委托(delegate)添加到您的
CustomMultiChildLayout
:
class YourLayoutDelegate extends MultiChildLayoutDelegate {
YourLayoutDelegate({this.position});
final Offset position;
@override
void performLayout(Size size) {
// ... (layout code from above)
}
@override
bool shouldRelayout(YourLayoutDelegate oldDelegate) {
return oldDelegate.position != position;
}
}
CustomMultiChildLayout(
delegate: YourLayoutDelegate(position: Offset.zero),
children: [
// ... (your children wrapped in LayoutId's)
],
)
1
和 2
如 id s 在本例中,但使用 enum
如果您有特定的 ID,可能是处理 ID 的最佳方式。 Listenable
至 super
(例如 super(relayout: animation)
)如果您想为布局过程设置动画或基于一般的可听对象触发它。 CustomSingleChildLayout
CustomSingleChildLayout
了解后会很明显
CustomMultiChildLayout
作品:
CustomMultiChildLayout is appropriate when there are complex relationships between the size and positioning of a multiple widgets. To control the layout of a single child, CustomSingleChildLayout is more appropriate.
CustomSingleChildLayout
遵循我上面描述的相同原则,但没有任何 id,因为只有一个 child 。
SingleChildLayoutDelegate
相反,它有不同的实现布局的方法(它们都有默认行为,所以从技术上讲,它们都是
覆盖 的可选):
getConstraintsForChild
,相当于我传递给 layoutChild
的约束以上。 getPositionForChild
,相当于 positionChild
以上。 LayoutId
并且只有一个 child 而不是
children
)。
MultiChildRenderObjectWidget
CustomMultiChildLayout
建立在。
CustomMultiChildLayout
(一般来说,有更多的控制):
CustomMultiChildLayout
不能大小 本身
基于其子项 (见
issue regarding better documentation for the reasoning)。
MultiChildRenderObjectWidget
我就不解释了这里的原因显而易见,但如果您有兴趣,可以查看
my submission to the Flutter Clock challenge 2020 年 1 月 20 日之后,我使用
MultiChildRenderObjectWidget
广泛 - 您还可以阅读
an article about this ,这应该解释一下它是如何工作的。
MultiChildRenderObjectWidget
是什么让
CustomMultiChildLayout
可能,直接使用它会给你带来一些好处,比如不必使用
LayoutId
而是能够访问
RenderObject
的父数据直接。
关于flutter - 如何在 Flutter 中使用 CustomMultiChildLayout & CustomSingleChildLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59483051/
我正在尝试从flutter应用程序构建apk,但出现此错误: Note: /mnt/Software/Linux/Flutter/flutter/.pub-cache/hosted/pub.dartl
我有一个名为 X 的较大应用程序,还有另一个名为 Y 的较小应用程序。他们现在彼此分开,并且工作正常。我想将应用程序 Y 集成到 X 中。我想将 Y 的代码放入 X 项目中,但它们应该有不同的 Mai
在android Studio中选择Create New Flutter Project,出现如下4个选项。 Flutter 应用程序 Flutter 插件 Flutter 包 flutter 模块
我看到我的 flutter 项目生成了一个文件 ios/Flutter/Flutter.podspec ,这个文件有什么用? 如果它与生成的 Flutter.framework 有关? 我应该将它包含
我尝试过的 在包含flutter SDK的位置添加/编辑.bash_profile.rtf文件。 导出PATH = / Users / temur / Documents / Projects / F
Flutter 日志会打印数千个详细/垃圾邮件日志。 我正在尝试调试一个复杂的应用程序,但是打印太冗长了,以至于我很难找到我自己打印的东西。 有没有办法禁用详细? 就像是: Logger.level.
在flutter 1.22更新之后,我在Lineargradient colors属性中遇到错误,这给我一个错误,即未定义名称colors参数。.在Android中更新flutter和flutter插
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
Flutter 1.0 发布后,我正在按照步骤搭建 Flutter 开发环境。 在步骤中(如所附屏幕截图所示),它说要更新 $PATH 两次,一次使用 flutter 工具的路径 export PAT
我有一个用 flutter 编写的移动应用程序,我想将其转换为 flutter_web 应用程序(集成 flutter_web 尚不可用)。我目前遇到包裹问题。 我已按照本网站中列出的说明进行操作 h
如何向我的 Flutter 路由添加自定义转换?这是我目前的路线结构。 class MyApp extends StatelessWidget { // This widget is the
我正在尝试通过 URL 在 webview 中显示网页。我试过 flutter_webview_plugin 插件,但是当我在浏览器上运行项目时它不起作用。 在 flutter web applica
我正在使用 animatedContainer 在按下按钮时显示 listView.builder()。这是一个要显示的简单子(monad)列表,但问题是我不知道 ListView 构建器的高度会传递
我目前正在我的应用程序中制作渐变背景动画......我正在使用 lottie 动画的帮助下这样做!我试图将它封装在一个容器中并成功地做到了。但是有一个问题,尽管我将高度更改为大于 2000 的东西,但
美好的一天! 我无法弄清楚如何使用 google 标签管理器设置 flutter。我找到了 this package包括标签管理器 api。但是我不知道如何正确配置它。 (在网络上我只需要复制粘贴一个
我的购物车模型如下 class Cart { String description; double unitCost; double amount; int quantity; S
在 Flutter 应用程序中,我想为在线托管的资源(图像、视频等)实现缓存。 我希望它能在原生平台 (Android/iOS)(例如使用文件系统)和网络(例如使用 IndexedDB)上运行。 Fl
我写了一个页面,在顶部一切都很好,应该是这样。在底部我有一个事件的历史。我的容器的宽度是自动确定的(取决于屏幕的宽度),而高度 - 不,在不同的设备上有不同的高度(底部的缩进是不同的)。是否可以自动确
我正在处理一个页面,其中有一些字段,例如 textfield 和 slider。在页面的末尾必须有一个用于进行下一步的按钮,该按钮被包裹在 Align 中以在页面之间具有固定位置。 另一方面,resi
我是一名优秀的程序员,十分优秀!