You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:44:54