首页 > 解决方案 > 我怎样才能让 pageView.Builder 在颤动中占据所有可用空间?

问题描述

我正在尝试在单击按钮时交换两个小部件,或者还有其他方法可以做到这一点吗?

当我设置 SizedBox(
height: double.infinity,
width: double.infinity, )
它给出错误:BoxConstraints forces an infinite height. 它在手动设置高度和宽度时工作。
我尝试使用
扩展和灵活它会给出这样的错误

RenderBox was not laid out: RenderRepaintBoundary#8b1a5 relayoutBoundary=up14 NEEDS-PAINT
'package:flutter/src/rendering/box.dart':
Failed assertion: line 1785 pos 12: 'hasSize'

代码

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController _uri = TextEditingController();
  bool flag=false;

  bool swap = false;
   int _index = 0;

  @override
  void initState() {
    swap = widget.swap;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {


    Widget swapWidget;
    if (!swap) {
      swapWidget =  Center(
        child: Expanded(
        // card height
          child: PageView.builder(
            itemCount: 2,
            controller: PageController(viewportFraction: 0.95),
            onPageChanged: (int index) => setState(() => _index = index),
            itemBuilder: (_, i) {
              return Transform.scale(
                scale: i == _index ? 1 : 0.9,
                child: Card(
                  elevation: 6,
                  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
                  child: Center(
                    child: Text(
                      "Card ${i + 1}",
                      style: TextStyle(fontSize: 32),
                    ),
                  ),
                ),
              );
            },
          
        
        )
        )
      );
    } else {
      swapWidget =new Card(
        child:Text('Nothing To show')
      );
    }

    var swapTile = new ListTile(
      title: swapWidget,
    );


    return new Scaffold(
      appBar: AppBar( title: Text('My APP')),
      body: new ListView(
          children: <Widget>[
            swapTile,
          ],
      ),
    );
  }

}

我在做什么错?谢谢

标签: flutterwidget

解决方案


我不完全确定您要在这里做什么,但很少有事情。PageView默认情况下,小部件会扩展到最大允许空间,因此您不需要围绕它的 Expanded 或 Center 小部件。

其次,我不知道你为什么Card要用ListTile. 你当然可以,但这不是 ListTile 和 Card 的设计方式。

第三,因为 PageView 小部件可以扩展,它需要一些尺寸限制,所以它不能放在像 ListView 这样无限大的小部件中,所以你可以删除它,这就是我所拥有的。我希望它接近你正在寻找的东西。

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool swap = true;
  int _index = 0;

  @override
  Widget build(BuildContext context) {
    Widget swapWidget;
    if (swap) {
      swapWidget = PageView.builder(
        itemCount: 2,
        controller: PageController(viewportFraction: 0.95),
        itemBuilder: (_, i) {
          return Transform.scale(
            scale: i == _index ? 1 : 0.9,
            child: Card(
              elevation: 6,
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(20)),
              child: Center(
                child: Text(
                  "Card ${i + 1}",
                  style: TextStyle(fontSize: 32),
                ),
              ),
            ),
          );
        },
      );
    } else {
      swapWidget = Card(child: Text('Nothing To show'));
    }

    return Scaffold(
      body: swapWidget,
    );
  }
}

推荐阅读