Flutter - 如何制作 PageView 和 ListView?

Hai*_*ana 2 dart flutter

我正在尝试使用 PageView、PageController 和 ListView 制作一个旋转木马,来自这张水平可滚动的卡片,在 flutter 中具有 Snap 效果。但它抛出了这个异常......

???通过渲染库捕获的异常 ????????????????????????????????????????????? ???????????? I/flutter (17678):在 performResize() 期间抛出以下断言: I/flutter (17678):水平视口被赋予无限高度。I/flutter (17678):视口在横轴上扩展以填充其容器并约束其子项以匹配 I/flutter (17678):它们在横轴上的范围。在这种情况下,水平视口被赋予无限量的 I/flutter (17678):可扩展的垂直空间。

有人可以帮我修复它吗?

我想在 Stack-filled 内添加这个 Carousel,里面有背景图像、变换类和淡入淡出过渡。

  @override
  void initState() {
   super.initState();
    controller = PageController(
     initialPage: 0,
     keepPage: true,
    );

 @override
  Widget build(BuildContext context) {

    return AnimatedBuilder(
        builder: (BuildContext context, Widget child) {
         return Scaffold(
           //BODY
          body: ListView(children: <Widget>[
            new Stack(
              children: <Widget>[
                new AspectRatio(...),
                new Transform(...),
                //THIS IS
                new ListView.builder(
                  itemCount: 3,
                  scrollDirection: Axis.horizontal,
                  padding: EdgeInsets.symmetric(vertical: 16.0),
                  itemBuilder: (BuildContext context, int index) {
                    if (index % 3 == 0) {
                      return _buildCarousel(context, index ~/ 3);
                    } else {
                      return Divider();
                    }
                  },
                ),
            }
         }
   }
   Widget _buildCarousel(BuildContext context, int carouselIndex) {
    return Column(
     mainAxisSize: MainAxisSize.min,
     children: <Widget>[
       Text('Carousel $carouselIndex'),
       SizedBox(
       // you may want to use an aspect ratio here for tablet support
         height: 200.0,
         child: PageView.builder(
        // store this controller in a State to save the carousel scroll position
         controller: PageController(viewportFraction: 0.8),
         itemBuilder: (BuildContext context, int itemIndex) {
           return _buildCarouselItem(context, carouselIndex, itemIndex);
         },
       ),
     )
   ],
 );
  Widget _buildCarouselItem(
    BuildContext context, int carouselIndex, int itemIndex) {
     return Padding(
     padding: EdgeInsets.symmetric(horizontal: 4.0),
       child: Container(
        decoration: BoxDecoration(
        color: Colors.grey,
        borderRadius: BorderRadius.all(Radius.circular(4.0)),
      ),
    ),
  );
Run Code Online (Sandbox Code Playgroud)

这是完整的代码https://pastebin.com/xXRkaWuR

Sid*_*kar 5

正如您可能从错误中猜到的那样,基本上这意味着由于您没有指定有限的高度,ListView因此获得了无限的高度。尝试shrinkWrap: true在您的ListView.builderListView.

或者,您也可以尝试将ListViews包裹在 aContainerSizedBox有限高度中。

例子-

Container(
  height: 200.0,
  child: ListView(
   /*Remaining Code*/
  ),
)
Run Code Online (Sandbox Code Playgroud)

你可以尝试做同样的事情 ListView.builder