【发布时间】:2020-02-17 12:49:43
【问题描述】:
我正在创建一个自定义小部件,该小部件将页脚作为最后一项添加到收到的任何可滚动小部件中。
理想的用法是这样的:
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。我尝试用Wrap或IntrinsicHeight包装widget.child,但它不起作用。如果widget.child没有shrinkWrap: true,我唯一能做的就是创建一个assert。 -
widget.child不必滚动,否则自定义小部件将不会滚动,因为widget.child被ListView包裹。我尝试用IgnorePointer或GestureDetector包裹widget.child,但我无法点击这些项目。如果widget.childphyisics不是NeverScrollableScrollPhysics,我唯一能做的就是创建一个assert。 - 如果
widget.child有一个controller,因为widget.child不应该是可滚动的,我必须将controller传递给父ListView,但我会得到:ScrollController attached to multiple scroll views。我唯一能做的就是允许自定义小部件接收controller并在widget.child有controller时生成assert。
问题
- 我该如何解决这些问题?
- 这是个好方法吗?
- 我还可以采取哪些其他方法?
【问题讨论】:
-
您要添加页脚,使其看起来像列表视图的最后一项,还是应该是容器底部的真正页脚?
-
应该是最后一项
-
看看这个github.com/showang/flutter_easy_listview,我想你可以在GitHub上挖掘他的代码,这里的代码不多
-
谢谢,但这仅适用于 ListView,我需要制作一个适用于任何类型 ScrollView 的自定义小部件,例如 GridView、StaggeredGridView 等。如果我采用类似于该链接的方法,我需要为每种类型的 ScrollView 制作许多自定义小部件,并传递每种类型的所有属性。
标签: flutter dart flutter-widget