作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个自定义小部件,该控件将页脚作为最后一项添加到收到的任何可滚动小部件中。
理想的用法是这样的:
ScrollableWithFooter(
child: ListView.builder(...),
footer: Text('Footer'),
)
ScrollableWithFooter(
child: GridView.builder(...),
footer: Text('Footer'),
)
ScrollableWithFooter(
child: CustomListView.builder(...),
footer: Text('Footer'),
)
ScrollableWithFooter(
child: SingleChildScrollView.builder(...),
footer: Text('Footer'),
)
ScrollableWithFooter(
child: StaggeredGridView.builder(...),
footer: Text('Footer'),
)
class ScrollableWithFooter extends StatefulWidget {
final ScrollView child;
final Widget footer;
ScrollableWithFooter({Key key, this.child, this.footer}) : super(key: key);
@override
State<StatefulWidget> createState() => ScrollableWithFooterState();
}
class ScrollableWithFooterState extends State<ScrollableWithFooter> {
final _scrollController = ScrollController();
@override
Widget build(BuildContext context) {
return ListView.builder(
controller: _scrollController,
scrollDirection: widget.child.scrollDirection,
itemCount: 2,
itemBuilder: (context, index) {
if (index == 0) {
return widget.child;
}
return widget.footer;
},
);
}
}
ScrollController
,因为我需要知道该页脚是否对其他功能可见。
widget.child
必须包装其内容,否则:Vertical viewport was given unbounded height
。我尝试用widget.child
或Wrap
包装IntrinsicHeight
,但是不起作用。我唯一能做的就是如果assert
没有widget.child
,则制作一个shrinkWrap: true
。 widget.child
,否则自定义窗口小部件将不会滚动,因为widget.child
用ListView
包装。我尝试用widget.child
或IgnorePointer
包装GestureDetector
,但无法点击这些项目。如果assert
不是widget.child
,我唯一能做的就是制作一个phyisics
。 NeverScrollableScrollPhysics
具有widget.child
,则由于controller
不应该滚动,因此我必须将该widget.child
传递给父controller
,但我会得到:ListView
。我唯一能做的就是允许自定义窗口小部件接收ScrollController attached to multiple scroll views
,如果controller
具有assert
,则制作一个widget.child
。 最佳答案
通过查看ScrollView
类,我找到了解决方案:
在自定义窗口小部件中,不必使用收到的widget.child
,而是创建一个新的Scrollable
小部件,方法是:
Scrollable
将具有NeverScrollableScrollPhysics
Scrollable
将没有controller
Scrollable
将返回带有以下内容的ShrinkWrappingViewport
:axisDirection
中的slivers
和widget.child
var _scrollController = ScrollController();
@override
void initState() {
super.initState();
_scrollController = widget.child.controller ?? _scrollController;
}
@override
Widget build(BuildContext context) {
return ListView.builder(
controller: widget.child.controller,
scrollDirection: widget.child.scrollDirection,
itemCount: 2,
itemBuilder: (context, index) {
if (index == 0) {
return Scrollable(
physics: NeverScrollableScrollPhysics(),
axisDirection: widget.child.getDirection(context),
viewportBuilder: (context, offset) {
return ShrinkWrappingViewport(
axisDirection: widget.child.getDirection(context),
offset: offset,
slivers: widget.child.buildSlivers(context),
);
},
);
}
return widget.footer;
},
);
}
@override
Widget build(BuildContext context) {
return Scrollable(
controller: widget.child.controller,
axisDirection: widget.child.getDirection(context),
viewportBuilder: (context, offset) {
return ShrinkWrappingViewport(
axisDirection: widget.child.getDirection(context),
offset: offset,
slivers: widget.child.buildSlivers(context)
..add(SliverList(delegate: SliverChildListDelegate([widget.footer]))),
);
},
);
}
final _scrollController = ScrollController();
// ListView
ScrollableWithFooter(
child: ListView.builder(
controller: _scrollController,
itemCount: 50,
itemBuilder: (context, index) => Text('Item $index'),
),
footer: Center(child: Text('Footer')),
)
// GridView
ScrollableWithFooter(
child: GridView.builder(
controller: _scrollController,
itemCount: 50,
itemBuilder: (context, index) => Text('Item $index'),
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
),
footer: Center(child: Text('Footer')),
)
关于flutter - Flutter-如何制作一个自定义小部件,以将页脚添加到接收到的可滚动小部件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58486152/
我是一名优秀的程序员,十分优秀!