#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 должен возвращать что-то, что должно отображаться внутри тела вашего каркаса, возможно, контейнер, столбец или любой другой обычный виджет.