Flutter LIstView中的颤振可忽略事件
我已经在Flutter LIstView中的颤振可忽略事件,flutter,Flutter,我已经在onDismissed:函数中实现了一个remove item方法 但此方法仅适用于列表的最后一项 如果删除任何其他项目,则会出现以下错误: 一个被解雇的小部件仍然是树的一部分。 复杂的是,我使用映射来保存和删除我需要的所有事件。但在调试模式下,索引似乎很好 错误出现在此setState方法之后: setState(() { print('_controller.selectedDay = ${_controller.selectedDay}');
onDismissed:
函数中实现了一个remove item方法
但此方法仅适用于列表的最后一项
如果删除任何其他项目,则会出现以下错误:
一个被解雇的小部件仍然是树的一部分。
复杂的是,我使用映射来保存和删除我需要的所有事件。但在调试模式下,索引似乎很好
错误出现在此setState方法之后:
setState(() {
print('_controller.selectedDay = ${_controller.selectedDay}');
customEvents[_controller.selectedDay].removeAt(index);
});
以下是代码部分:
Widget myCalendarBuild(BuildContext context, List<dynamic> shiftList) {
return ListView.separated(
separatorBuilder: (BuildContext context, int index) =>
Divider(color: Colors.black),
itemCount: _listOfShiftsPerGivenDay.length,
itemBuilder: (BuildContext context, int index) {
return Dismissible(
key: Key(customEvents[_controller.selectedDay][index].toString()),
onDismissed: (direction){
// removeShift(index);
Shift deleteShift = getParametersFromWidgetInTheList(index: index);
// remove from database
DatabaseProvider.db.delete(deleteShift.id).then((_) =>
BlocProvider.of<ShiftBloc>(context)
.add(DeleteShift(deleteShift.id)));
setState(() {
print('_controller.selectedDay = ${_controller.selectedDay}');
customEvents[_controller.selectedDay].removeAt(index);
});
showSnackBar(context);
},
child: Container(
width: MediaQuery.of(context).size.width,
padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0),
child: Row(
children: <Widget>[
Expanded(
flex: 3,
child: customEvents[_controller.selectedDay][index],
),
Expanded(
flex: 1,
//fixme: catch when the user clicks back instead of submit when editing/ ading a shift
child: GestureDetector(
onTap: () {
Shift shift =
getParametersFromWidgetInTheList(index: index);
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => ShiftForm(
shift: shift,
),
),
);
},
child: Container(
child: Icon(FontAwesomeIcons.edit),
color: Colors.teal,
),
),
),
Expanded(
flex: 1,
//fixme: catch when the user clicks back instead of submit when editing/ ading a shift
child: GestureDetector(
onTap: () {
Shift deleteShift =
getParametersFromWidgetInTheList(index: index);
// remove from database
DatabaseProvider.db.delete(deleteShift.id).then((_) =>
BlocProvider.of<ShiftBloc>(context)
.add(DeleteShift(deleteShift.id)));
// remove from customEvents Map
setState(() {
customEvents[_controller.selectedDay].removeAt(index);
showSnackBar(context);
});
// after deleting the item I have to refresh the list
// calendarBuild(context, shiftList);
},
child: Container(
child: Icon(FontAwesomeIcons.trash),
color: Colors.red,
),
),
)
],
),
// ),
),
);
},
);
}
小部件myCalendarBuild(BuildContext上下文,列表移位列表){
返回ListView.separated(
separatorBuilder:(BuildContext上下文,int索引)=>
分隔器(颜色:颜色。黑色),
itemCount:_listOfShiftsPerGivenDay.length,
itemBuilder:(构建上下文,int索引){
可驳回的回报(
key:key(customEvents[\u controller.selectedDay][index].toString()),
onDismissed:(方向){
//移除移位(索引);
Shift-deleteShift=GetParametersFromWidgetInTestList(索引:index);
//从数据库中删除
DatabaseProvider.db.delete(deleteShift.id)。然后(()=>
BlocProvider.of(上下文)
.add(DeleteShift(DeleteShift.id));
设置状态(){
打印(“\u controller.selectedDay=${\u controller.selectedDay}”);
customEvents[\u controller.selectedDay].removeAt(索引);
});
showSnackBar(上下文);
},
子:容器(
宽度:MediaQuery.of(context).size.width,
填充:边缘组。对称(水平:10.0,垂直:5.0),
孩子:排(
儿童:[
扩大(
弹性:3,
子项:customEvents[\u controller.selectedDay][index],
),
扩大(
弹性:1,
//fixme:在编辑/编辑轮班时,当用户单击“上一步”而不是“提交”时捕获
儿童:手势检测器(
onTap:(){
轮班=
GetParametersFromWidgetInTestList(索引:index);
导航器。推(
上下文
材料路线(
生成器:(BuildContext上下文)=>ShiftForm(
班次:班次,
),
),
);
},
子:容器(
子:图标(FontAwesomeIcons.edit),
颜色:Colors.teal,
),
),
),
扩大(
弹性:1,
//fixme:在编辑/编辑轮班时,当用户单击“上一步”而不是“提交”时捕获
儿童:手势检测器(
onTap:(){
移位删除移位=
GetParametersFromWidgetInTestList(索引:index);
//从数据库中删除
DatabaseProvider.db.delete(deleteShift.id)。然后(()=>
BlocProvider.of(上下文)
.add(DeleteShift(DeleteShift.id));
//从customEvents映射中删除
设置状态(){
customEvents[\u controller.selectedDay].removeAt(索引);
showSnackBar(上下文);
});
//删除项目后,我必须刷新列表
//日历构建(上下文、移位列表);
},
子:容器(
子:图标(FontAwesomeIcons.trash),
颜色:颜色,红色,
),
),
)
],
),
// ),
),
);
},
);
}
在这里,您可以看到我向左滑动以删除事件时发生的情况。也标记为黄色:
找到了问题
它发生在以下行:
key: Key(customEvents[_controller.selectedDay][index].toString()),
我只需将其替换为以下内容:
key: UniqueKey(),
问题可能发生在地图中