Как вложить ListView в просмотр страницы

#flutter #flutter-layout

#flutter #flutter-макет

Вопрос:

У меня есть горизонтальный просмотр страницы с некоторым вложенным вертикальным просмотром списка на каждой странице.

проблема в том, что я не могу прокручивать эти вложенные listview, поскольку я регистрирую только PageView жесты.

примечание: когда я использую SliverChildBuilderDelegate inside customSCrollView без ограничений, прокрутка фактически активна, но все остальное нет

вот как выглядит код

 class ProductDetail extends StatefulWidget {
  
  @override
  State<StatefulWidget> createState() => ProductDetailState();
}

class ProductDetailState extends State {
  

  @override
  Widget build(BuildContext context) {
    return Material(
      child: DefaultTabController(
        length: 2,
        child: Column(
          children: [
            Expanded(
              child: NestedScrollView(
//                 physics: BouncingScrollPhysics(),
                headerSliverBuilder:
                    (BuildContext context, bool innerBoxIsScrolled) {
                  return <Widget>[];
                },
                body: PageView( // this is a pageView container
                  children: <Widget>[
                    CustomScrollView(
                      slivers: [
                       SliverList(
                          delegate: SliverChildBuilderDelegate(
                            (context, index) {
                              return ListTile(
                                title: Text('index $index'),
                              );
                            },
                            childCount: 10
                          ),
                        )
                       ]
                    ),
                    CustomScrollView(
                      slivers: [
                       SliverList(
                          delegate: SliverChildBuilderDelegate(
                            (context, index) {
                              return ListTile(
                                title: Text('index $index'),
                              );
                            },
                            childCount: 10
                          ),
                        )
                       ]
                    ),
                  ],
                ),
              ),
            ),
            Container(
              height: 30,
//               child: 
            )
          ],
        ),
      ),
    );
  }
}
 

Ответ №1:

NestedScrollView здесь что-то не так. Поскольку вы не используете headerSliverBuilder , вы можете просто полностью удалить виджет. Вот рабочий код.

 @override
Widget build(BuildContext context) {
  return Material(
    child: PageView(
      children: <Widget>[
        CustomScrollView(
          slivers: [
            SliverList(
              delegate: SliverChildBuilderDelegate(
                (context, index) => ListTile(title: Text('index $index')),
                childCount: 20,
              ),
            )
          ],
        ),
        CustomScrollView(
          slivers: [
            SliverList(
              delegate: SliverChildBuilderDelegate(
                (context, index) => ListTile(title: Text('index $index')),
                childCount: 20,
              ),
            )
          ],
        ),
      ],
    ),
  );
}
 

Комментарии:

1. это действительно работает, хотя я до сих пор не понимаю, как жест регистрирует гонку между этими виджетами 1

2. @bihireboris Когда вы используете ListView inside NestedScrollView , он отдает предпочтение последнему, поэтому ListView он не прокручивается. Для этого могут быть обходные пути, но я ничего не пробовал самостоятельно.