代码之家  ›  专栏  ›  技术社区  ›  Robbert

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

  •  53
  • Robbert  · 技术社区  · 6 年前

    我做了一个 ListView 在弗利特,但现在我有一些 ListTiles 在这个 列表视图 可以选择的。选择后,我希望背景颜色更改为我选择的颜色。我不知道怎么做。 在里面 the docs 他们提到 ListTile 有一个属性 style . 然而,当我尝试添加它时(如下面代码的最后第三行),这 风格 属性下面有一条弯曲的红线,编译器告诉我 The named parameter 'style' isn't defined

    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,),
      );
    }
    
    14 回复  |  直到 2 年前
        1
  •  38
  •   Bagata    6 年前

    我可以使用 盒子装饰 在…内 容器 :

    ListView (
        children: <Widget>[
            new Container (
                decoration: new BoxDecoration (
                    color: Colors.red
                ),
                child: new ListTile (
                    leading: const Icon(Icons.euro_symbol),
                    title: Text('250,00')
                )
            )
        ]
    )
    
        2
  •  36
  •   CopsOnRoad    3 年前

    屏幕截图:

    enter image description here


    简短回答:

    ListTile(
      tileColor: isSelected ? Colors.blue : null, 
    )
    

    完整代码:

    // You can also use `Map` but for the sake of simplicity I'm using two separate `List`.
    final List<int> _list = List.generate(20, (i) => i);
    final List<bool> _selected = List.generate(20, (i) => false); // Fill it with false initially
      
    Widget build(BuildContext context) {
      return Scaffold(
        body: ListView.builder(
          itemBuilder: (_, i) {
            return ListTile(
              tileColor: _selected[i] ? Colors.blue : null, // If current item is selected show blue color
              title: Text('Item ${_list[i]}'),
              onTap: () => setState(() => _selected[i] = !_selected[i]), // Reverse bool value
            );
          },
        ),
      );
    }
    
        3
  •  25
  •   Herbert Poul    5 年前

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

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

    Ripple Effect

        4
  •  19
  •   Rémi Rousselet    6 年前

    不是的 ListTile 那有 style 所有物但是 ListTileTheme 列表时间名称 是一个继承的小部件。就像其他人一样 向下 数据(如此处的主题)。

    要使用它,您必须包装任何小部件 在上面 您的ListTile带有 列表时间名称 包含所需的值。

    列表平铺 然后将根据最接近的 列表时间名称 例子

        5
  •  10
  •   Rustem Kakimov    4 年前

    ListTile Ink

    Ink(
      color: isSelected ? Colors.blue : Colors.transparent,
      child: ListTile(title: Text('hello')),
    )
    
        6
  •  9
  •   Bhavin Desai    4 年前

    这不再是痛苦!

    现在您可以使用 tileColor selectedTileColor 的属性 ListTile widget来实现它。

    看看这个 Issue #61347 合并到master中。

        7
  •  6
  •   ritz    3 年前

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

       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;
                              });
                            }));
                  })
            ]));
      }
    }
    
    

    Dartpad链接: https://dartpad.dev/250ff453b97cc79225e8a9c657dffc8a

        8
  •  4
  •   Aleksandar    4 年前

    我知道原来的问题已经得到了回答,但我想补充一下 如何设置的颜色 ListTile 当瓷砖被压下时 . 您正在查找的属性称为 highlight color 可以通过包装 列表平铺 在a中 Theme 小部件,如下所示:

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

    注: 如果 主题 小部件重置 列表平铺 ,只需设置 fontFamily 属性设置为应用程序中其他位置使用的相同值。

        9
  •  4
  •   Milan Kumar    4 年前

    遗憾的是,ListTile没有background color属性。因此,我们必须简单地将ListTile小部件包装到一个容器/卡片小部件中,然后才能使用它的color属性。 此外,我们必须提供一定高度的SizedBox小部件,以分离相同颜色的ListTiles。

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

    我希望这一定会对你有帮助。

    屏幕截图: see how it works

                return 
                  ListView(
                    children: snapshot.data.documents.map((doc) {
                      return Column(children: [
                        Card(
                          color: Colors.grey[200],
                           child: ListTile(
                          leading: Icon(Icons.person),
                          title: Text(doc.data['coursename'], style: TextStyle(fontSize: 22),),
                          subtitle: Text('Price: ${doc.data['price']}'),
                          trailing: IconButton(
                            icon: Icon(Icons.delete),
                            onPressed: () async {
                              await Firestore.instance
                                  .collection('courselist')
                                  .document(doc.documentID)
                                  .delete();
                            },
                          ),
                      ),
                        ),
                     SizedBox(height: 2,)
                      ],);
                    }).toList(),[enter image description here][1]
                  );
    
        10
  •  2
  •   dhiraj    4 年前

    我曾用过

    ListTile(
                    title: Text('Receipts'),
                    leading: Icon(Icons.point_of_sale),
                    tileColor: Colors.blue,
                  ),  
    
        11
  •  1
  •   vencedor    3 年前

    有两种道具:tileColor和selectedTileColor。

    tileColor -未选择平铺/行时;

    selectedTileColor -选择平铺/行时

    ListTile(
            selected: _isSelected,
            tileColor: Colors.blue,
            selectedTileColor: Colors.greenAccent,
    )
    
        12
  •  0
  •   Subir Chakraborty    5 年前

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

    这里DroperItem是保存isSelected值的模型类。背景颜色取决于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,
            ),
          ));
        }
    

    enter image description here

        13
  •  0
  •   Navid All Gray    4 年前

    你的答案已经用英语回答了 Github

    Card(
      color: Colors.white,
      shape: ContinuousRectangleBorder(
        borderRadius: BorderRadius.zero,
      ),
      borderOnForeground: true,
      elevation: 0,
      margin: EdgeInsets.fromLTRB(0,0,0,0),
      child: ListTile(
        // ...
      ),
    )
    
        14
  •  0
  •   Muhammad Nadeem    2 年前

    enter image description here &燃气轮机;生成变量

            int slectedIndex;
    

    随时可用

         onTap:(){
                          setState(() {
                          selectedIndex=index;
                         })
    

    平铺属性

                color:selectedIndex==index?Colors.red :Colors.white,
    

    与列表视图生成器中的相同

            ListView.builder(
                              itemCount: 10,
                              scrollDirection:Axis.vertical,
                              itemBuilder: (context,index)=>GestureDetector(
                                onTap:(){
                                  setState(() {
                                    selectedIndex=index;
                                  });
                                  
                                } ,
                                child: Container(
                                  margin: EdgeInsets.all(8),
                                  decoration: BoxDecoration(
                                    borderRadius: BorderRadius.circular(5),
                                    color:selectedIndex==index?Colors.red :Colors.white,
                                  ),)