当列表视图的项目在颤动的视口中可见时,如何更改项目颜色并执行一些操作?

Posted

技术标签:

【中文标题】当列表视图的项目在颤动的视口中可见时,如何更改项目颜色并执行一些操作?【英文标题】:How to change the item color and do some action when the item of the listview is visible in the viewport in flutter? 【发布时间】:2020-12-08 10:04:23 【问题描述】:

我使用 for 循环生成了一个项目列表,然后将这些项目添加到 tabbarview 的列表视图中。 在 listView 中,有一些项目(容器),当该特定项目在屏幕上完全显示时,我想要这些东西:

    屏幕还应显示列表中特定项目的描述。 屏幕上未完全显示的其余项目(容器)应具有不同的颜色和大小,但它们在屏幕上部分可见。 当滚动到列表视图中的另一个时,当该特定项目的显示率超过 60% 时,该特定项目应自动在屏幕上显示 100%,并使其余项目具有不同的大小和颜色。

代码我正在制作项目(container)并像这样添加那些container


  //this is tabviewer maker
  tabViewerMaker(BuildContext context) 
    List<ListView> tabBarView = List();
    for (var i = 0; i < tabsText.length; i++) 
      tabBarView.add(
        ListView(
            scrollDirection: Axis.horizontal,
            children: containerAdder(i, context)),
      );
    
    return tabBarView;
  

//this is for adding container to the listview
  containerAdder(initialI, BuildContext context) 
    List<Widget> listViewContainer = List();

    for (var j = 0; j < mainListAllPlantDetailsList1.length; j++) 
      if (tabsText[initialI] == mainListAllPlantDetailsList1[j].ca) 
        listViewContainer.add(Container(
            child: Column(
          children: [
            GestureDetector(
              onTap: () 
                Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => ParticularPlant2(
                            indexNumber: j,
                          )),
                );
              ,
              child: Container(
                  height: 350,
                  width: 250,
                  child: Stack(
                    children: [
                      Positioned(
                        bottom: 10,
                        child: Container(
                          padding: EdgeInsets.fromLTRB(25, 50, 20, 20),
                          height: 160,
                          width: 220,
                          decoration: BoxDecoration(
                            color: Colors.lightGreen,
                            borderRadius: BorderRadiusDirectional.only(
                              bottomEnd: Radius.circular(80),
                              topEnd: Radius.circular(80),
                              topStart: Radius.circular(80),
                            ),
                          ),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Text(
                                mainListAllPlantDetailsList1[j].ca,
                                style: TextStyle(
                                    color: Color(0xFFC8E392), fontSize: 15),
                              ),
                              Text(
                                mainListAllPlantDetailsList1[j].pN,
                                style: TextStyle(
                                    color: Color(0xFFEAF4D5), fontSize: 25),
                              ),
                              Text(
                                  "\$" +
                                      mainListAllPlantDetailsList1[j]
                                          .pr
                                          .toString(),
                                  style: TextStyle(
                                      color: Colors.white,
                                      fontSize: 30,
                                      fontWeight: FontWeight.w600)),
                            ],
                          ),
                        ),
                      ),
                      Positioned(
                        top: 20,
                        left: 25,
                        child: Container(
                            height: 210,
                            child: Image(
                                image: AssetImage(
                                    mainListAllPlantDetailsList1[j].pI))),
                      )
                    ],
                  )),
            ),            
          ],
        )));
       else 
        continue;
      
    
    return listViewContainer;
  

我对 Flutter 完全陌生。请帮我解决这个问题。

【问题讨论】:

【参考方案1】:

我也需要这个并最终使用了这个解决方案: https://github.com/flutter/flutter/issues/19941#issuecomment-538742609

【讨论】:

以上是关于当列表视图的项目在颤动的视口中可见时,如何更改项目颜色并执行一些操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在可滚动部分的视口中更改项目的样式属性?

如何在颤动的列表视图中设置卡片的宽度?

如何在颤动中使用动画列表对最初渲染的项目进行动画处理

当视图当前不可见时更改集合视图的滚动位置

如何在颤动/飞镖的 ListView 项目中更改背景颜色

找出 ListView 中的哪些项目是可见的