我正在处理一个proyect,其中我的listView列出了名为alarmcard的自定义窗口小部件,其中每个都带有警报对象的信息。一个警报卡有两个布尔的预言:扩展和加载,这是主要代码:
class _AlarmCardState extends State<AlarmCard>{
bool _expanded = false;
bool _loading = false;
static const double iconSize = 28.0;
static const Color iconColor = Colors.black87;
static const TextStyle fieldTextStyle = TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.w400,
color: Color.fromRGBO(0, 0, 0, 0.6),
);
static const TextStyle clearFieldTextStyle = TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.w400,
color: Color.fromRGBO(0, 0, 0, 0.2),
);
@override
Widget build(BuildContext context) {
TextStyle timeTextStyle = TextStyle(
fontSize: 54.0,
fontWeight: FontWeight.w400,
color: Colors.black54,
);
Widget card = Card(
child: Column(
children: <Widget>[
Opacity(
opacity: _loading ? 1.0 : 0.0,
child: Container(
height: 3.0,
child: ClipRRect(
child: LinearProgressIndicator(),
borderRadius: BorderRadius.only(
topRight: Radius.circular(3.0),
topLeft: Radius.circular(3.0),
),
),
),
),
Padding(
padding: const EdgeInsets.fromLTRB(12.0, 8.0, 12.0, 8.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 6.0, bottom: 8.0),
child: InkWell(
onTap: () => _selectTime(context),
child: Text(widget.alarm.timeString, style: timeTextStyle)
),
),
Switch(value: widget.alarm.enabled, onChanged: _onAlarmEnabledChange),
],
),
AnimatedCrossFade(
firstChild: _getContractedBottom(),
secondChild: _getExpandedBottom(),
duration: Duration(milliseconds: 200),
crossFadeState: _expanded ? CrossFadeState.showSecond : CrossFadeState.showFirst,
)
],
),
),
],
),
);
return _loading ?
Opacity(
opacity: 0.6,
child: IgnorePointer(
child: card
),
)
: card;
}
...
}
当然,还有更多的自定义小部件作为daytoggle和方法,例如_getContractedBottom((和_getExpandedBottom((,它们返回了一个小部件。一旦定义了依赖_扩展和_ loading的警报卡构建方法,我们就会使用final List<Alarm> alarmList
构建ListView AS:
ListView.builder(
itemCount: alarmList.length,
itemBuilder: (BuildContext context, int i) {
Alarm alarm = alarmList[i];
return AlarmCard(
alarm: alarm,
ringtones: ringtoneList,
onAlarmUpdated: () => true,
onAlarmDeleted: () {
setState(() {
alarmList.remove(alarm);
});
return true;
}
);
},
)
因此,ListView运行完美,每个项目都应按照应有的方式显示,可以扩展和更新(以便_负载变为true(。当项目被删除时,问题出在。
想象一下警报清单有8个项目,所有项目都显示在屏幕上,我们仅扩展并删除第六项。当我们按DELETE的那一刻,警报卡变为加载状态,然后被删除,但是一旦将其从listView中删除后,第7个项目"继承" _expanded和_loading Propierties,因此它显示的是正确的信息,与它的警报相对应,但是它已经扩展和加载,而不应该。
有人知道问题可能在哪里吗?我一直在多个网站和Stackoverflow帖子上进行搜索,但找不到这个问题。非常感谢!
正如 @javired98所说,问题是在密钥中。那个视频帮助我。但是请记住,如果您有小部件的列表,则在将其添加到widget类中时,键必须传递给小部件。
imageList.add(ImageElement(
key:ValueKey(imageCounter),
id: ...,
imgURL: ...,
.
.
.
));