Listview 在颤振中选择后更改ListTile的背景色

Listview 在颤振中选择后更改ListTile的背景色,listview,user-interface,dart,background-color,flutter,Listview,User Interface,Dart,Background Color,Flutter,我在flatter中制作了一个ListView,但是现在我在ListView中有一些ListTiles可以选择。选择后,我希望背景颜色更改为我选择的颜色。我不知道怎么做。 在本文中,他们提到listile有一个属性style。但是,当我尝试添加它时(如下面代码的最后三行),这个style属性下面有一条扭曲的红线,编译器告诉我,命名参数“style”没有定义 Widget _buildRow(String string){ return new ListTile( title: new

我在flatter中制作了一个
ListView
,但是现在我在
ListView
中有一些
ListTiles
可以选择。选择后,我希望背景颜色更改为我选择的颜色。我不知道怎么做。 在本文中,他们提到
listile
有一个属性
style
。但是,当我尝试添加它时(如下面代码的最后三行),这个
style
属性下面有一条扭曲的红线,编译器告诉我,
命名参数“style”没有定义

Widget _buildRow(String string){
  return new ListTile(
    title: new Text(string),
    onTap: () => setState(() => toggleSelection(string)),
    selected: selectedFriends.contains(string),
    style: new ListTileTheme(selectedColor: Colors.white,),
  );
}

不是
listile
具有
style
属性。但是
listtiletime
ListTileTheme
是一个继承的小部件。和其他方法一样,它用于传递数据(比如这里的主题)

要使用它,您必须使用包含所需值的
ListTileTheme
包装列表互动程序上方的任何小部件


ListTile
将根据最近的
ListTileTheme
实例来设置主题本身。

我能够使用框装饰容器内更改ListTile的背景色:

ListView (
    children: <Widget>[
        new Container (
            decoration: new BoxDecoration (
                color: Colors.red
            ),
            child: new ListTile (
                leading: const Icon(Icons.euro_symbol),
                title: Text('250,00')
            )
        )
    ]
)
ListView(
儿童:[
新容器(
装饰:新盒子装饰(
颜色:颜色。红色
),
孩子:新的ListTile(
前导:常量图标(图标。欧元符号),
标题:文本('250,00')
)
)
]
)

如果您还需要一个具有连锁反应的
onTap
侦听器,您可以使用
Ink

ListView(
  children: [
    Ink(
      color: Colors.lightGreen,
      child: ListTile(
        title: Text('With lightGreen background'),
        onTap() { },
      ),
    ),
  ],
);

我可以通过将ListTile作为容器小部件的子部件并向容器小部件添加颜色来更改其背景颜色

这里,DroperItem是保存isSelected值的模型类。背景颜色取决于选定的值

注意:对于未选中的项目,请保持颜色透明,以便仍能获得涟漪效果

 for (var i = 0; i < drawerItems.length; i++) {
      var drawerItem = drawerItems[i];
      drawerOptions.add(new Container(
        color: drawerItem.isSelected
            ? Colors.orangeAccent
            : Colors.transparent,
        child: new ListTile(
          title: new Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[Text(drawerItem.title), drawerItem.count],
          ),
          leading: SvgPicture.asset(
            drawerItem.icon,
            width: 34,
            height: 34,
          ),
          onTap: () {
            _handleNavigation(i);
          },
          selected: drawerItem.isSelected,
        ),
      ));
    }
for(变量i=0;i

屏幕截图:

// you can do that by using `Map` but for simplicity I used 2 separate `List`. 
List<int> _list = List.generate(20, (i) => i);
List<bool> _selected = List.generate(20, (i) => false); // initially fill it up with false

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(),
    body: ListView.builder(
      itemBuilder: (_, i) {
        return Container(
          margin: const EdgeInsets.symmetric(vertical: 2),
          color: _selected[i] ? Colors.blue : null, // if current item is selected show blue color
          child: ListTile(
            title: Text("Item ${_list[i]}"),
            onTap: () => setState(() => _selected[i] = !_selected[i]), // reverse bool value
          ),
        );
      },
    ),
  );
}


解决方案:

// you can do that by using `Map` but for simplicity I used 2 separate `List`. 
List<int> _list = List.generate(20, (i) => i);
List<bool> _selected = List.generate(20, (i) => false); // initially fill it up with false

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(),
    body: ListView.builder(
      itemBuilder: (_, i) {
        return Container(
          margin: const EdgeInsets.symmetric(vertical: 2),
          color: _selected[i] ? Colors.blue : null, // if current item is selected show blue color
          child: ListTile(
            title: Text("Item ${_list[i]}"),
            onTap: () => setState(() => _selected[i] = !_selected[i]), // reverse bool value
          ),
        );
      },
    ),
  );
}
//您可以使用'Map'来实现这一点,但为了简单起见,我使用了两个单独的'List'。
List _List=List.generate(20,(i)=>i);
List _selected=List.generate(20,(i)=>false);//最初用false填充它
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:ListView.builder(
itemBuilder:(u,i){
返回容器(
边距:常量边集。对称(垂直:2),
颜色:_selected[i]?Colors.blue:null,//如果选择当前项,则显示蓝色
孩子:ListTile(
标题:文本(“项目${{U列表[i]}”),
onTap:()=>设置状态(()=>_selected[i]=!_selected[i]),//反转布尔值
),
);
},
),
);
}

列表磁砖
包装在一个文件中

墨水(
颜色:isSelected?颜色。蓝色:颜色。透明,
子项:ListTile(标题:Text('hello')),
)

我知道原来的问题已经得到了回答,但我想补充一点,如何在按下互动程序时设置
列表互动程序的颜色。您要查找的属性称为
高亮显示颜色
,可以通过在
主题
小部件中包装
列表磁贴
进行设置,如下所示:

Theme(
  data: ThemeData(
    highlightColor: Colors.red,
  ),
  child: ListTile(...),
  )
);


注意:如果
主题
小部件重置了
ListTile
中文本元素的字体,只需将其
fontFamily
属性设置为应用程序中其他位置使用的相同值。

不幸的是,ListTile没有背景色属性。因此,我们必须简单地将ListTile小部件包装到一个容器/卡片小部件中,然后使用它的color属性。 此外,我们必须提供具有一定高度的SizedBox小部件来分隔相同颜色的ListTiles

我正在分享对我有用的东西:)

我希望它一定会帮助你

截图:


一种简单的方法是将初始索引存储在变量中,然后在点击时更改该变量的状态

   ListView.builder(
              shrinkWrap: true,
              itemCount: 4,
              itemBuilder: (context, index) {
                return Container( //I have used container for this example. [not mandatory]
                    color: tappedIndex == index ? Colors.blue : Colors.grey,
                    child: ListTile(
                        title: Center(
                      child: Text('${index + 1}'),
                    ),onTap:(){
                          setState((){
                            tappedIndex=index;
                          });
                        }));
              })
完整代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyWidget(),
    );
  }
}

class MyWidget extends StatefulWidget {
  @override
  MyWidgetState createState() => MyWidgetState();
}

class MyWidgetState extends State<MyWidget> {
  late int tappedIndex;

  @override
  void initState() {
    super.initState();
    tappedIndex = 0;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
          ListView.builder(
              shrinkWrap: true,
              itemCount: 4,
              itemBuilder: (context, index) {
                return Container(
                    color: tappedIndex == index ? Colors.blue : Colors.grey,
                    child: ListTile(
                        title: Center(
                      child: Text('${index + 1}'),
                    ),onTap:(){
                          setState((){
                            tappedIndex=index;
                          });
                        }));
              })
        ]));
  }
}

导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
主页:MyWidget(),
);
}
}
类MyWidget扩展了StatefulWidget{
@凌驾
MyWidgetState createState()=>MyWidgetState();
}
类MyWidgetState扩展了状态{
晚int-tappendex;
@凌驾
void initState(){
super.initState();
tappendex=0;
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
ListView.builder(
收缩膜:对,
物品计数:4,
itemBuilder:(上下文,索引){
返回容器(
颜色:tappedIndex==索引?颜色。蓝色:颜色。灰色,
孩子:ListTile(
标题:中心(
子:文本('${
Card(
  color: Colors.white,
  shape: ContinuousRectangleBorder(
    borderRadius: BorderRadius.zero,
  ),
  borderOnForeground: true,
  elevation: 0,
  margin: EdgeInsets.fromLTRB(0,0,0,0),
  child: ListTile(
    // ...
  ),
)
ListTile(
                title: Text('Receipts'),
                leading: Icon(Icons.point_of_sale),
                tileColor: Colors.blue,
              ),  
ListTile(
        selected: _isSelected,
        tileColor: Colors.blue,
        selectedTileColor: Colors.greenAccent,
)