Я создаю настраиваемый виджет, который добавляет нижний колонтитул в качестве последнего элемента к любому полученному виджету с возможностью прокрутки.
Идеальное использование было бы таким:
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
имеетcontroller
.
Вопросы
- Как я могу решить эти проблемы?
- Это хороший подход?
- Какие еще подходы я мог бы использовать?