使用DraggableFlatList时出现Reanimated对象修改警告的解决咨询
解决DraggableFlatList + Reanimated的"modify key
current of an object passed to a worklet"警告 1. 绑定拖拽触发函数到拖拽手柄
你的renderItem中渲染了拖拽手柄图标,但未将DraggableFlatList提供的drag函数绑定到组件上,这会导致Reanimated内部worklet无法正确初始化拖拽逻辑,进而触发警告。修改拖拽手柄代码,添加拖拽触发事件:
{isEditing && ( <IconMaterial name='drag-handle' size={20} color="#555" style={styles.flatlistItemDragHandle} onLongPress={drag} // 绑定拖拽触发函数 /> )}
可根据交互需求选择onLongPress或onPressIn。
2. 严格保证data数组的不可变性
Reanimated的worklet会持有data中item对象的引用,若在JS线程直接修改item属性(而非通过创建新数组更新data),就会触发该警告。确保所有data更新遵循不可变原则:
- 修改item时,通过
map生成新数组:
// 示例:更新指定item的属性 setData(prevData => prevData.map(item => item.id === targetId ? {...item, title: newTitle} : item ));
- 不要直接修改
data中的item对象(如item.selected = true),建议用独立状态(如selectedIds数组)管理选中逻辑(你的代码中getItemSelectedOrder的实现符合这个思路,继续保持)。
3. 避免外部持有并修改item引用
如果openEditViewSet(item)会将item引用传递到其他组件并修改其属性,会导致DraggableFlatList的worklet持有的对象被意外修改。解决方法是传递item的副本:
onPress={() => { if (isEditing) { toggleItemSelection(item.id); } else { openEditViewSet({...item}); // 传递副本而非原引用 } }}
验证修改
完成上述调整后,重新运行项目,拖拽操作时的警告应该会消失。核心逻辑是确保传递给DraggableFlatList的item对象在worklet运行期间不被JS线程修改,同时正确绑定拖拽触发函数让组件内部逻辑正常执行。
内容的提问来源于stack exchange,提问作者tsuyoski
相关产品推荐
相关产品推荐

