在 Flutter 中选择时更改 ListTile 的背景颜色
Change background color of ListTile upon selection in Flutter
我在Flutter里做了一个ListView
,现在这个ListView
里有一些ListTiles
可以选择。选择后,我希望背景颜色更改为我选择的颜色。我不知道该怎么做。
在 the docs 中,他们提到 ListTile
有一个 属性 style
。但是,当我尝试添加它时(如下面代码中的倒数第三行),此 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,),
);
}
ListTile
没有 style
属性。但是ListTileTheme
。
ListTileTheme
是一个继承的Widget。和其他人一样,它用于传递 down 数据(例如此处的主题)。
要使用它,您必须用包含所需值的 ListTileTheme
将 ListTile 上方的任何小部件包装起来。
ListTile
将根据最近的 ListTileTheme
实例为自己设置主题。
我能够使用 Container 中的 BoxDecoration 更改 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')
)
)
]
)
如果你还需要一个 onTap
具有涟漪效应的监听器,你可以使用 Ink
:
ListView(
children: [
Ink(
color: Colors.lightGreen,
child: ListTile(
title: Text('With lightGreen background'),
onTap() { },
),
),
],
);
通过使 ListTile 成为容器小部件的子项并向容器小部件添加颜色,我能够更改 ListTile 的背景颜色。
这里的 drawerItem 是保存 isSelected 值的模型 class。背景颜色取决于 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,
),
));
}
截图:
简答:
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
);
},
),
);
}
将 ListTile
换成 Ink
。
Ink(
color: isSelected ? Colors.blue : Colors.transparent,
child: ListTile(title: Text('hello')),
)
我知道原来的问题已经回答了,但我想添加如何在按下图块时设置ListTile
的颜色。您要查找的 属性 称为 highlight color
,可以通过将 ListTile
包装在 Theme
小部件中来设置它,如下所示:
Theme(
data: ThemeData(
highlightColor: Colors.red,
),
child: ListTile(...),
)
);
注意:如果Theme
小部件重置了ListTile
内文本元素的字体,只需设置它的fontFamily
[=26] =] 与您在应用其他地方使用的值相同。
遗憾的是,ListTile 没有背景颜色属性。因此,我们必须简单地将 ListTile 小部件包装到 Container/Card 小部件中,然后我们可以使用它的颜色 属性。
此外,我们必须提供具有一定高度的 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]
);
一种简单的方法是将初始索引存储在一个变量中,然后在每次点击时更改该变量的状态。
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;
});
}));
})
]));
}
}
飞镖板link:https://dartpad.dev/250ff453b97cc79225e8a9c657dffc8a
这不再是痛苦!
现在您可以使用 ListTile
小部件的 tileColor
和 selectedTileColor
属性 来实现它。
看看这个 Issue #61347 已合并到 master 中。
您的回答已在 Github 中得到解答。
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,
),
有两个道具:tileColor 和 selectedTileColor。
tileColor
- 当tile/row未选中时;
selectedTileColor
- 当 tile/row 被选中时
ListTile(
selected: _isSelected,
tileColor: Colors.blue,
selectedTileColor: Colors.greenAccent,
)
enter image description here>制作变量
int slectedIndex;
on tap
onTap:(){
setState(() {
selectedIndex=index;
})
Tile property
color:selectedIndex==index?Colors.red :Colors.white,
Same As in List View Builder
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,
),)
我在Flutter里做了一个ListView
,现在这个ListView
里有一些ListTiles
可以选择。选择后,我希望背景颜色更改为我选择的颜色。我不知道该怎么做。
在 the docs 中,他们提到 ListTile
有一个 属性 style
。但是,当我尝试添加它时(如下面代码中的倒数第三行),此 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,),
);
}
ListTile
没有 style
属性。但是ListTileTheme
。
ListTileTheme
是一个继承的Widget。和其他人一样,它用于传递 down 数据(例如此处的主题)。
要使用它,您必须用包含所需值的 ListTileTheme
将 ListTile 上方的任何小部件包装起来。
ListTile
将根据最近的 ListTileTheme
实例为自己设置主题。
我能够使用 Container 中的 BoxDecoration 更改 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')
)
)
]
)
如果你还需要一个 onTap
具有涟漪效应的监听器,你可以使用 Ink
:
ListView(
children: [
Ink(
color: Colors.lightGreen,
child: ListTile(
title: Text('With lightGreen background'),
onTap() { },
),
),
],
);
通过使 ListTile 成为容器小部件的子项并向容器小部件添加颜色,我能够更改 ListTile 的背景颜色。
这里的 drawerItem 是保存 isSelected 值的模型 class。背景颜色取决于 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,
),
));
}
截图:
简答:
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
);
},
),
);
}
将 ListTile
换成 Ink
。
Ink(
color: isSelected ? Colors.blue : Colors.transparent,
child: ListTile(title: Text('hello')),
)
我知道原来的问题已经回答了,但我想添加如何在按下图块时设置ListTile
的颜色。您要查找的 属性 称为 highlight color
,可以通过将 ListTile
包装在 Theme
小部件中来设置它,如下所示:
Theme(
data: ThemeData(
highlightColor: Colors.red,
),
child: ListTile(...),
)
);
注意:如果Theme
小部件重置了ListTile
内文本元素的字体,只需设置它的fontFamily
[=26] =] 与您在应用其他地方使用的值相同。
遗憾的是,ListTile 没有背景颜色属性。因此,我们必须简单地将 ListTile 小部件包装到 Container/Card 小部件中,然后我们可以使用它的颜色 属性。 此外,我们必须提供具有一定高度的 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]
);
一种简单的方法是将初始索引存储在一个变量中,然后在每次点击时更改该变量的状态。
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;
});
}));
})
]));
}
}
飞镖板link:https://dartpad.dev/250ff453b97cc79225e8a9c657dffc8a
这不再是痛苦!
现在您可以使用 ListTile
小部件的 tileColor
和 selectedTileColor
属性 来实现它。
看看这个 Issue #61347 已合并到 master 中。
您的回答已在 Github 中得到解答。
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,
),
有两个道具:tileColor 和 selectedTileColor。
tileColor
- 当tile/row未选中时;
selectedTileColor
- 当 tile/row 被选中时
ListTile(
selected: _isSelected,
tileColor: Colors.blue,
selectedTileColor: Colors.greenAccent,
)
enter image description here>制作变量
int slectedIndex;
on tap
onTap:(){
setState(() {
selectedIndex=index;
})
Tile property
color:selectedIndex==index?Colors.red :Colors.white,
Same As in List View Builder
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,
),)