如何让 pageView.Builder 占据所有可用空间?

问题描述

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

当我设置 大小盒(
高度:double.infinity,
宽度: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,],);
  }

}

我做错了什么? 谢谢你

解决方法

我不完全确定您在这里尝试做什么,但很少有事情。默认情况下,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,);
  }
}