可滚动的 ListView 将背景颜色渗入相邻的小部件

Posted

技术标签:

【中文标题】可滚动的 ListView 将背景颜色渗入相邻的小部件【英文标题】:Scrollable ListView bleeds background color to adjacent widgets 【发布时间】:2021-08-26 22:39:42 【问题描述】:

我希望使用可滚动的 ListView 创建一个简单的布局,并带有一个不可移动的标题图块。我已将标题图块和 ListView 放入一个 Column 中,因此 Header 可以位于 ListView 上方而无需滚动屏幕。但是,当滚动 ListView 时,我的标题图块似乎呈现出在它“下方”滚动的任何 ListView 图块的颜色。

在启动时,应用程序如下所示:

但是,如果我们向下滚动半个图块,列表图块的绿色似乎将红色从标题中推出。绿色瓦片中的文本没有相同的问题,并且被标题瓦片正确遮挡

重构的最少代码

void main() => runApp(MyTestApp2());

class MyTestApp2 extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: Text("AppBar Header"),
          ),
          body: Column(children: <Widget>[
            ListTile(
              title: Center(child: Text("This Header Should be Red")),
              tileColor: Colors.redAccent,
            ),
            Expanded(child: ListView(
              children: List.generate(20, (int index) => "List Item $index")
                  .map((n) => ListTile(
                      title: Text(n.toString()),
                      tileColor: Colors.lightGreen))
                  .toList(),
            )),
          ])),
    );
  

这里发生了什么?我可能可以使用不同的 Widget 来实现这种布局,但我想知道为什么会出现这种颜色溢出效果?它如何与 Flutter 使用的框布局模型相匹配?

编辑:直接的问题可以通过将红色 ListTile 包装在 Container 小部件中来解决,并将该容器上的颜色属性设置为红色,如下所示:

        Container(
          color: Colors.redAccent,
          child: ListTile(....

但是,如果有人知道的话,我仍然想知道原始代码中的布局算法发生了什么。 header tile 的存在不应该阻止我们的 listview 将其元素推入红色 ListTile 拥有的区域吗?

【问题讨论】:

对我来说工作正常,没有发生颜色渗色。在此处查看图片 [图片]imgur.com/a/qhbgnAl。我已经复制了你的代码并在我的本地运行它。它工作正常。您可以运行一次颤振医生并查看颤振和飞镖更新 感谢您的评论。我已经运行了颤振医生并且没有遇到任何错误。我还验证了(模拟)android 上的 Flutter Web 和 Flutter 都会发生错误。我在 pubspec.yaml 中的 SDK 版本是 '>=2.12.0 【参考方案1】:

请尝试使用 Material 小部件包装 listTile 我不知道为什么,但是 tileColor 在小部件下保持活动状态,同时向下滚动瓷砖的颜色在上面的小部件下。 用 Material 包裹 listTile 应该可以解决这个问题。

Material(
                      child: ListTile(
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(10),
                        ),
                        tileColor:const Color.fromARGB(255, 247, 247, 247),
                        leading: Icon(
                          Icons.monetization_on_outlined,
                          color: Theme.of(context).primaryColor,
                          size: 50,
                        ),
                        title: Text(
                          "Some Strings",
                        ),
                        subtitle: Text("Some Strings"),
                        onLongPress: () ,
                        onTap: () ,
                      ),
                    )

【讨论】:

谢谢!我能够确认在我的示例中将 Material 小部件放在 ListView 的正上方可以解决问题。

以上是关于可滚动的 ListView 将背景颜色渗入相邻的小部件的主要内容,如果未能解决你的问题,请参考以下文章

ListView 不在定位的小部件中滚动

更改可扩展 ListView Android 中单击的子项的背景颜色

android的ListView中如何设置长按Item的时候该Item背景变色

如何使用 ListView.separated 使整个屏幕可滚动

列表视图滚动更改项目视图的背景颜色(简单适配器)

滚动时背景ListView变黑