单击列表中相应卡片时更改图标 Flutter
Change icon when clicking on the corresponding card in the list Flutter
我想做的是,当您单击图标(在卡片上)时,另一个图标会发生变化。但是整个列表中的所有图标都不会改变(就像我所做的那样),而只会改变相应卡片中的图标。以后请求会从API中获取,但是现在为了测试我创建了一个数据sheet。告诉我如何正确实施?
final List<String> list = [
"Eli's Poynt AC",
"Eli's Poynt Home DC",
];
bool isSettings = false;
ListView.builder(
shrinkWrap: true,
itemCount: list.length + 1,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(bottom: 16),
child: Container(
height: 112,
padding:
const EdgeInsets.symmetric(horizontal: 21, vertical: 16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: constants.Colors.greyDark,
),
child: Row(
children: [
SizedBox(
height: 80,
width: 80,
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.asset('assets/images/poynt.jpg'),
),
),
const SizedBox(width: 15),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
list[index],
style: constants.Styles.normalHeavyTextStyleWhite,
),
const SizedBox(height: 6),
const Text(
'Evan Gbirol St, 18',
style: constants.Styles.smallBookTextStyleWhite,
),
],
),
),
SvgPicture.asset(constants.Assets.poynt1),
const SizedBox(width: 20),
IconButton(
onPressed: () {
setState(() {
isSettings = !isSettings;
});
},
icon: isSettings
? SvgPicture.asset(constants.Assets.remove2)
: SvgPicture.asset(constants.Assets.threeDot),
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
),
将 ListView 中的容器作为新小部件提取到新的有状态 class 中,并在 ListView 中调用它 class。
您需要为每个项目创建一个包含 isSetting 变量的 bool 列表;
final List<String> list = [
"Eli's Poynt AC",
"Eli's Poynt Home DC",
];
List<bool> isSettings = [];
ListView.builder(
shrinkWrap: true,
itemCount: list.length + 1,
itemBuilder: (context, index) {
isSettings.add(false);
return Padding(
padding: const EdgeInsets.only(bottom: 16),
child: Container(
height: 112,
padding:
const EdgeInsets.symmetric(horizontal: 21, vertical: 16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: constants.Colors.greyDark,
),
child: Row(
children: [
SizedBox(
height: 80,
width: 80,
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.asset('assets/images/poynt.jpg'),
),
),
const SizedBox(width: 15),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
list[index],
style: constants.Styles.normalHeavyTextStyleWhite,
),
const SizedBox(height: 6),
const Text(
'Evan Gbirol St, 18',
style: constants.Styles.smallBookTextStyleWhite,
),
],
),
),
SvgPicture.asset(constants.Assets.poynt1),
const SizedBox(width: 20),
IconButton(
onPressed: () {
setState(() {
isSettings[index] = !isSettings[index];
});
},
icon: isSettings[index]
? SvgPicture.asset(constants.Assets.remove2)
: SvgPicture.asset(constants.Assets.threeDot),
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
),
我想做的是,当您单击图标(在卡片上)时,另一个图标会发生变化。但是整个列表中的所有图标都不会改变(就像我所做的那样),而只会改变相应卡片中的图标。以后请求会从API中获取,但是现在为了测试我创建了一个数据sheet。告诉我如何正确实施?
final List<String> list = [
"Eli's Poynt AC",
"Eli's Poynt Home DC",
];
bool isSettings = false;
ListView.builder(
shrinkWrap: true,
itemCount: list.length + 1,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(bottom: 16),
child: Container(
height: 112,
padding:
const EdgeInsets.symmetric(horizontal: 21, vertical: 16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: constants.Colors.greyDark,
),
child: Row(
children: [
SizedBox(
height: 80,
width: 80,
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.asset('assets/images/poynt.jpg'),
),
),
const SizedBox(width: 15),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
list[index],
style: constants.Styles.normalHeavyTextStyleWhite,
),
const SizedBox(height: 6),
const Text(
'Evan Gbirol St, 18',
style: constants.Styles.smallBookTextStyleWhite,
),
],
),
),
SvgPicture.asset(constants.Assets.poynt1),
const SizedBox(width: 20),
IconButton(
onPressed: () {
setState(() {
isSettings = !isSettings;
});
},
icon: isSettings
? SvgPicture.asset(constants.Assets.remove2)
: SvgPicture.asset(constants.Assets.threeDot),
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
),
将 ListView 中的容器作为新小部件提取到新的有状态 class 中,并在 ListView 中调用它 class。
您需要为每个项目创建一个包含 isSetting 变量的 bool 列表;
final List<String> list = [
"Eli's Poynt AC",
"Eli's Poynt Home DC",
];
List<bool> isSettings = [];
ListView.builder(
shrinkWrap: true,
itemCount: list.length + 1,
itemBuilder: (context, index) {
isSettings.add(false);
return Padding(
padding: const EdgeInsets.only(bottom: 16),
child: Container(
height: 112,
padding:
const EdgeInsets.symmetric(horizontal: 21, vertical: 16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: constants.Colors.greyDark,
),
child: Row(
children: [
SizedBox(
height: 80,
width: 80,
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.asset('assets/images/poynt.jpg'),
),
),
const SizedBox(width: 15),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
list[index],
style: constants.Styles.normalHeavyTextStyleWhite,
),
const SizedBox(height: 6),
const Text(
'Evan Gbirol St, 18',
style: constants.Styles.smallBookTextStyleWhite,
),
],
),
),
SvgPicture.asset(constants.Assets.poynt1),
const SizedBox(width: 20),
IconButton(
onPressed: () {
setState(() {
isSettings[index] = !isSettings[index];
});
},
icon: isSettings[index]
? SvgPicture.asset(constants.Assets.remove2)
: SvgPicture.asset(constants.Assets.threeDot),
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
),