Android 颤振列表视图:删除项目时,下一个项目将继承一些属性
我正在开发一个项目,其中有一个名为AlarmCard的自定义小部件列表视图,每个小部件都填充有报警对象的信息。 AlarmCard有两个布尔属性:扩展和加载,这是主代码:Android 颤振列表视图:删除项目时,下一个项目将继承一些属性,android,ios,listview,flutter,flutter-layout,Android,Ios,Listview,Flutter,Flutter Layout,我正在开发一个项目,其中有一个名为AlarmCard的自定义小部件列表视图,每个小部件都填充有报警对象的信息。 AlarmCard有两个布尔属性:扩展和加载,这是主代码: class _AlarmCardState extends State<AlarmCard>{ bool _expanded = false; bool _loading = false; static const double iconSize = 28.0; static const Color
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;
}
...
}
因此,ListView工作得很好,每个项目都按其应有的方式显示,可以对其进行扩展和更新(以便实现_加载)。删除项目时会出现问题
想象一下alarmList有8个项目,它们都显示在屏幕上,我们只展开和删除第6个项目。当我们按Delete键时,AlarmCard将变为加载状态,然后被删除,但一旦它从ListView中删除,第7项“继承”了“扩展”和“加载”属性,因此它会显示与其报警相对应的正确信息,但它是扩展和加载的,而不应该
有人知道问题出在哪里吗?
我一直在多个网站和stackoverflow帖子上搜索,但找不到这个问题。
非常感谢 尝试设置状态((){list=list.from(list)…removeAt(index);})@Vinet不,我刚试过,我也犯了同样的错误。你有没有找到解决办法?我刚刚遇到了完全相同的问题,正要问一个问题,突然出现了这个问题。如果我没有错的话,我想我用来解决这个问题的方法是在每个列表项中使用一个UniqueKey。你可以在这里得到更多的信息
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;
}
);
},
)