Flutter Horizontal scroll list - 如何将其设置为比父级更宽
Flutter Horizontal scroll list - How to set it wider than the parent
我有一个表单,里面有几个文本字段和一个水平滚动视图,我可以在其中上传一些图像。
表单的宽度小于屏幕,因此列表视图也受到影响。我希望此列表视图溢出他的父项并与 phone 屏幕一样宽。
我该怎么做?我正在尝试使用 OverflowBox,但出现错误。这是我的工作代码:
class HorizontalScrollWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return
Container(
child: Column(
children: [
Container(
child: AutoSizeText(
".....",
maxLines: 1,
style: ....,
),
),
_buildFeaturedCards(5),
],
),
);
}
}
Widget _buildFeaturedCards(int maxLength) {
final cards = <Widget>[];
Widget ScrollableCardsRow;
if (maxLength > 0) {
for (int i = 0; i < maxLength; i++) {
cards.add( SquarePhotoElement() );
}
ScrollableCardsRow = Container(
// TODO: OverflowBox??
child: Column(
children: <Widget>[
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(children: cards),
),
],
),
);
} else {
ScrollableCardsRow = Container();
}
return ScrollableCardsRow;
}
感谢您的帮助
不可能让child大于parent,至少是违背设计模式的。当您这样做时,hitTest 将失败。换句话说,如果你的child(比如C)大于parent(比如P),并且你正在点击一个C显示但P没有显示的位置,那么C永远不会收到任何点击事件。这是因为 parent P 认为“哦那个水龙头不在我的区域所以我就忽略它”。然后 P 永远不会接受那个点击,所以 C 永远不会看到那个事件。因此,重构您的小部件树以避免这种情况。
另一种方法是使用Overlay
(或使用Portal
库,它是Overlay的包装器).覆盖不受此限制。
像这样使用 属性 width
的容器 width: double.infinity
class HorizontalScrollWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
child: Column(
children: [
Container(
child: AutoSizeText(
".....",
maxLines: 1,
style: ....,
),
),
_buildFeaturedCards(5),
],
),
);
}
Widget _buildFeaturedCards(int maxLength) {
final cards = <Widget>[];
Widget ScrollableCardsRow;
if (maxLength > 0) {
for (int i = 0; i < maxLength; i++) {
cards.add( SquarePhotoElement() );
}
ScrollableCardsRow = Container(
// TODO: OverflowBox??
width: double.infinity,
child: Column(
children: <Widget>[
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(children: cards),
),
],
),
);
} else {
ScrollableCardsRow = Container();
}
return ScrollableCardsRow;
}
}
我希望上面的解决方案对你有用,但如果不行,那么你也可以试试下面的代码。在这里,您只需将列表传递给包含在 Flexible 中的网格视图构建器。
Flexible(
child: GridView.builder(
itemCount: listProducts.length ,
scrollDirection: Axis.horizontal,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1,
mainAxisSpacing: 0,
childAspectRatio: 2,
),
itemBuilder: (BuildContext context, int index) {
return Text("");
})),
我有一个表单,里面有几个文本字段和一个水平滚动视图,我可以在其中上传一些图像。
表单的宽度小于屏幕,因此列表视图也受到影响。我希望此列表视图溢出他的父项并与 phone 屏幕一样宽。
我该怎么做?我正在尝试使用 OverflowBox,但出现错误。这是我的工作代码:
class HorizontalScrollWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return
Container(
child: Column(
children: [
Container(
child: AutoSizeText(
".....",
maxLines: 1,
style: ....,
),
),
_buildFeaturedCards(5),
],
),
);
}
}
Widget _buildFeaturedCards(int maxLength) {
final cards = <Widget>[];
Widget ScrollableCardsRow;
if (maxLength > 0) {
for (int i = 0; i < maxLength; i++) {
cards.add( SquarePhotoElement() );
}
ScrollableCardsRow = Container(
// TODO: OverflowBox??
child: Column(
children: <Widget>[
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(children: cards),
),
],
),
);
} else {
ScrollableCardsRow = Container();
}
return ScrollableCardsRow;
}
感谢您的帮助
不可能让child大于parent,至少是违背设计模式的。当您这样做时,hitTest 将失败。换句话说,如果你的child(比如C)大于parent(比如P),并且你正在点击一个C显示但P没有显示的位置,那么C永远不会收到任何点击事件。这是因为 parent P 认为“哦那个水龙头不在我的区域所以我就忽略它”。然后 P 永远不会接受那个点击,所以 C 永远不会看到那个事件。因此,重构您的小部件树以避免这种情况。
另一种方法是使用Overlay
(或使用Portal
库,它是Overlay的包装器).覆盖不受此限制。
像这样使用 属性 width
的容器 width: double.infinity
class HorizontalScrollWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
child: Column(
children: [
Container(
child: AutoSizeText(
".....",
maxLines: 1,
style: ....,
),
),
_buildFeaturedCards(5),
],
),
);
}
Widget _buildFeaturedCards(int maxLength) {
final cards = <Widget>[];
Widget ScrollableCardsRow;
if (maxLength > 0) {
for (int i = 0; i < maxLength; i++) {
cards.add( SquarePhotoElement() );
}
ScrollableCardsRow = Container(
// TODO: OverflowBox??
width: double.infinity,
child: Column(
children: <Widget>[
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(children: cards),
),
],
),
);
} else {
ScrollableCardsRow = Container();
}
return ScrollableCardsRow;
}
}
我希望上面的解决方案对你有用,但如果不行,那么你也可以试试下面的代码。在这里,您只需将列表传递给包含在 Flexible 中的网格视图构建器。
Flexible(
child: GridView.builder(
itemCount: listProducts.length ,
scrollDirection: Axis.horizontal,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1,
mainAxisSpacing: 0,
childAspectRatio: 2,
),
itemBuilder: (BuildContext context, int index) {
return Text("");
})),