使整个屏幕具有两个动态小部件

时间:2020-03-12 16:58:04

标签: flutter flutter-layout

中,我有两个小部件: TableCalendar 和一个包含 ListView.builder 容器。两者都有动态尺寸。

我希望我的容器填充日历中剩余的屏幕尺寸。

我认为我可以用 Expanded 小部件来包装这两个小部件,但这只会导致错误。

在performLayout()期间引发了以下断言:RenderFlex 子项的flex值非零,但传入的高度限制 无界的。

enter image description here

这是我的代码:

child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TableCalendar(
              events: _events, //fixme: here is the problem
              initialCalendarFormat: CalendarFormat.twoWeeks,
              calendarController: _controller,
              calendarStyle: CalendarStyle(),
              headerStyle: HeaderStyle(
                centerHeaderTitle: true,
                formatButtonDecoration: BoxDecoration(
                  color: Colors.pinkAccent.shade100,
                  borderRadius: BorderRadius.circular(20.0),
                ),
                formatButtonShowsNext: false,
              ),
              startingDayOfWeek: StartingDayOfWeek.monday,
              onDaySelected: (date, events) {
                setState(() {
                  _listOfShiftsPerGivenDay = events;
                });
              },
              builders: CalendarBuilders(
                  selectedDayBuilder: (context, date, events) => Container(
                        alignment: Alignment.center,
                        margin: EdgeInsets.all(4.0),
                        color: Colors.pink,
//                        decoration: BoxDecoration(),
                        child: Text(
                          date.day.toString(),
                        ),
                      ),
                  todayDayBuilder: (context, date, events) => Container(
                        alignment: Alignment.center,
                        margin: EdgeInsets.all(4.0),
                        color: Colors.teal.shade100,
                        child: Text(
                          date.day.toString(),
                          style: TextStyle(
                              fontWeight: FontWeight.bold, fontSize: 18.0),
                        ),
                      ),
                  markersBuilder: (context, date, events, holidays) {
                    final children = <Widget>[];

                    if (events.isNotEmpty) {
                      children.add(
                        Positioned(
                          right: 1,
                          bottom: 1,
                          child: _buildEventsMarker(date, events),
                        ),
                      );
                    }
                    return children;
                  }),
            ),
            Container(
              //fixme: the hight needs to be variable
              height: 200.0,
              child: ListView.builder(
                itemCount: _listOfShiftsPerGivenDay.length,
                itemBuilder: (context, index) => Container(
                  width: MediaQuery.of(context).size.width,
                  padding:
                      EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0),
                  child: _events[_controller.selectedDay][index],
//                  ),
                ),
              ),
            )
          ],
        ),

2 个答案:

答案 0 :(得分:2)

开始时主列的父级是什么?是另一栏吗?

在这种情况下,请尝试在列开头以Expanded包裹,这将对其子对象施加高度限制,然后可以使用Expanded on Container。

child: Expanded(
  child: Column(
    children: <Widget>[

      TableCalendar();

      Expanded(
        child: Container()
      )
  ])

如果您想了解更多信息,我已经在《 Medium》上写了article,说明了为什么会发生这种情况。

答案 1 :(得分:0)

如果将ListView()包装在扩展中怎么办?

child: Column(
  children: <Widget>[

    TableCalendar();

    Expanded(
      child: ListView.builder()
    )
])