Flutter / Dart — вложенные конструкторы просмотра страниц по горизонтали и вертикали?

#flutter #dart #nested #flutter-pageview

#flutter #dart #вложенный #flutter-просмотр страницы

Вопрос:

После просмотра каждой страницы по горизонтали PageView.builder я хотел бы вызвать вертикальный PageView.builder, чтобы предоставить каждой странице свой собственный вертикальный список ответов. Каков наилучший способ сделать это?

   class StageBuilder extends StatelessWidget {
  final List<SpeakContent> speakcrafts;
  StageBuilder(this.speakcrafts);

  final PageController controller = PageController(initialPage: 0);

  @override
  Widget build(context) {
    return PageView.builder(
      controller: controller,
      itemCount: speakcrafts.length,
      itemBuilder: (context, int currentIndex) {
        return createViewItem(speakcrafts[currentIndex], context, currentIndex);
      },
    );
  }

  Widget createViewItem(SpeakContent speakcraft, BuildContext context, int currentIndex) {
  
    return Scaffold(
        body: (some stuff),
     );
  }
}
  

Ответ №1:

Проблема в том, что вы помещаете каркас внутри вашего PageView, когда должно быть иначе.
Смотрите пример ниже:

 class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Padding(
          padding: const EdgeInsets.symmetric(vertical: 50, horizontal: 20),
          child: PageViewDemo(),
        ),
      ),
    );
  }
}

class PageViewDemo extends StatefulWidget {
  @override
  _PageViewDemoState createState() => _PageViewDemoState();
}

class _PageViewDemoState extends State<PageViewDemo> {

  PageController _controller = PageController(
    initialPage: 0,
  );

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return PageView(
      controller: _controller,
      children: [
        MyPage1Widget(),
        MyPage2Widget(),
        MyPage3Widget(),
      ],
    );
  }
}
  

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

1. Я использую pageview.builder. Должен ли я вместо этого использовать просмотр страницы? Как я могу получить доступ к моему текущему ItemCount: speakcrafts.length, itemBuilder: (context, int currentIndex) {

2. Проблема не в pageview.builder, она возвращает каркас внутри него (из функции createViewItem). Ваш виджет StageBuilder должен быть телом каркаса, а ваш createViewItem должен возвращать что-то, что должно отображаться внутри тела вашего каркаса, возможно, контейнер, столбец или любой другой обычный виджет.