flutter 抖动:使用列时RenderFlex溢出

kiz8lqtg  于 2023-01-21  发布在  Flutter
关注(0)|答案(2)|浏览(149)

我得到一个renderflex溢出错误,显示如下:

它来自下面的代码:

return Column(
                      children: [
                        DropdownButton<String>(
                            items: Utils.ddsDropdown
                                .map<DropdownMenuItem<String>>((String value) {
                              return DropdownMenuItem<String>(
                                value: value,
                                child: Text(value),
                              );
                            }).toList(),
                            onChanged: (value) {}),
                        ListView.builder(
                          shrinkWrap: true,
                          padding: const EdgeInsets.fromLTRB(0, 16, 0, 16),
                          itemCount: card.length,
                          itemBuilder: (context, index) {
                            return MyCard.buildCard(card[index], context);
                          },
                        )
                      ],
                    )

我也尝试过用Expanded widget和SingleChildScrollView来 Package 这个列,但是仍然得到了同样的错误。我认为这个列阻止了页面的完全滚动。但是我需要这个列能够有DropdownButton和ListView。
我甚至尝试将整个小部件 Package 在SingleChildScrollView中,如下所示:

Widget build(BuildContext context) => SingleChildScrollView(
          child: FutureBuilder<List<Map<String, dynamic>>>(
        future: MyCard.getData(widget.categoryIndex, widget.subCategories)!
            .whenComplete(() => setState(() {
                  isLoading = false;
                })),
        builder: ((context, snapshot) {
          if (snapshot.hasData && snapshot.data!.isNotEmpty) {
            return FutureBuilder<List<MyCard>>(
                future: MyCard.readData(snapshot.data),
                builder: (context, cards) {
                  if (cards.hasData) {
                    final card = cards.data!;
                    return Column(
                      children: [
                        //Text("Hello"),
                        DropdownButton<String>(
                            items: Utils.ddsDropdown
                                .map<DropdownMenuItem<String>>((String value) {
                              return DropdownMenuItem<String>(
                                value: value,
                                child: Text(value),
                              );
                            }).toList(),
                            onChanged: (value) {}),
                        ListView.builder(
                          shrinkWrap: true,
                          padding: const EdgeInsets.fromLTRB(0, 16, 0, 16),
                          itemCount: card.length,
                          itemBuilder: (context, index) {
                            return MyCard.buildCard(card[index], context);
                          },
                        )
                      ],
                    );
                  } else {
                    return const Text("No data");
                  }
                });
          } else {
            return isLoading
                ? Column(
                    children: const [CircularProgressIndicator()],
                  )
                : const Text("You do not have any workouts yet");
          }
        }),
      ));

但还是会溢出。

hmmo2u0o

hmmo2u0o1#

按如下所示仅将ListView换行为Expanded:

Column(
  children: [
    DropdownButton<String>(
    ...
    Expanded(
      child: ListView.builder(
...

This other answer将为您提供有关您的问题的更多详细信息。

vddsk6oq

vddsk6oq2#

使用SingleChildScrollView使用该列的可滚动区域,如下所示:

return SingleChildScrollView(
         child: Column(
                  children: [
                    DropdownButton<String>(
                        items: Utils.ddsDropdown
                            .map<DropdownMenuItem<String>>((String value) {
                          return DropdownMenuItem<String>(
                            value: value,
                            child: Text(value),
                          );
                        }).toList(),
                        onChanged: (value) {}),
                    ListView.builder(
                      shrinkWrap: true,
                      padding: const EdgeInsets.fromLTRB(0, 16, 0, 16),
                      itemCount: card.length,
                      itemBuilder: (context, index) {
                        return MyCard.buildCard(card[index], context);
                      },
                    )
                  ],
                )

希望这解决了你的问题。

相关问题