Flutter - 使用列表视图生成器在列中创建可滚动子项

问题描述 投票:0回答:4

我正在构建一个计算器应用程序,其中我想要一个可滚动子项用于之前的计算,但由于我已经使用 Column 来列出不同的小部件,它向我显示了 hassize 类型的错误。

下面是设计的一部分的图像,其中选择了我想要滚动的区域

enter image description here

这是我为视图(页面)编写的代码

SafeArea(
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.end,
      children: [
        ThemeSwitcher(height: height),
        Padding(
          padding: EdgeInsets.only(top: height * 0.15, right: width * 0.03),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.end,
            children: [
// From here I want the Widget to be Scollable based on the List declared before
              Container(
                child: SingleChildScrollView(
                  child: Column(children: [
                    ListView.builder(
                      itemBuilder: (context, index) => Text(
                        textEval[index],
                        style: TextStyle(
                          fontSize: (width * 0.045),
                          fontWeight: FontWeight.w500,
                          height: 2,
                        ),
                      ),
                    )
                  ]),
                ),
              ),
// The Elements between these two comments I want to be in a scrollable child view
              Text(
                textEval[textEval.length - 2],
                style: TextStyle(
                  fontSize: (width * 0.045),
                  fontWeight: FontWeight.w500,
                  height: 2,
                ),
              ),
              Text(
                mainText,
                style: TextStyle(
                  fontSize: (width * 0.08),
                  fontWeight: FontWeight.w500,
                  height: 2,
                ),
              ),
            ],
          ),
        )
      ],
    ),
  ),

任何人都可以告诉我如何实现这一目标吗?

android flutter dart cross-platform
4个回答
2
投票

这是 Flutter 中常见的模式。你可能已经尝试过

Column(
    children: [
        ...,
        SingleChildScrollView(
            child: Column()   // 2nd column
        )
    ]
)

这不起作用,因为 SingleChildScrollView 可以采用无限高度,而 Column 可以允许无限高度。

解决这个问题的最简单方法是用 Expanded 小部件包装 SingleChildScrollVIew

Column(
    children: [
        ...,
        Expanded(
             child: SingleChildScrollView(
                   child: Column()   // 2nd column
             )
        )
    ]
)

这将使 SingleChildScrollView 占据 Column 中的剩余高度。但如果你希望它是特定值的高度,则将 Expanded 替换为指定高度的 Sizedbox。


1
投票

您可以通过删除额外的小部件(如

Column
)来简化结构。

SingleChildScrollView
包裹
Expanded
以获得可滚动子项的可用空间。

SingleChildScrollView
已经处理滚动时 事件
ListView.builder
滚动事件将重叠并导致问题。您可以使用
shrinkWrap: true, primary: false,
physics: const NeverScrollableScrollPhysics(),shrinkWrap: true,
来解决此问题。

演示片段

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.end,
          mainAxisSize: MainAxisSize.min,
          children: [
            // From here I want the Widget to be Scollable based on the List declared before
            Expanded(
              child: SingleChildScrollView(
                child: Column(
                  // mainAxisSize: MainAxisSize.min,
                  children: [
                    ListView.builder(
                      itemCount: 53,
                      shrinkWrap: true,
                      primary: false,
                      // physics: const NeverScrollableScrollPhysics(),
                      itemBuilder: (context, index) => Text(
                        "    textEval[index] $index",
                        style: const TextStyle(
                          fontWeight: FontWeight.w500,
                          height: 2,
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
            // The Elements between these two comments I want to be in a scrollable child view
            const Text(
              "textEval[textEval.length - 2]",
              style: TextStyle(
                fontWeight: FontWeight.w500,
                height: 2,
              ),
            ),
            const Text(
              "mainText",
              style: TextStyle(
                fontWeight: FontWeight.w500,
                height: 2,
              ),
            ),
          ],
        ),
      ),
    );
  }

1
投票

只需用 SizedBox 包裹

ListView.builder
并设置高度和宽度


0
投票

使用 SingleChildScrollView() 包裹列。

© www.soinside.com 2019 - 2024. All rights reserved.