添加进去后报错 LUA ERROR: ASSERT FAILED ON LUA EXECUTE: child already added. It can't be added again
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-05-23 11:35:11 |
👁️ 阅读: 2
这个错误是因为你重复添加了同一个子节点到父节点中。在996引擎中,一个控件只能有一个父节点,不能重复添加。
根据浮生梦老师前端课程内容,常见的原因和解决方案:
## 常见错误场景:
1. **重复调用添加函数**:
```lua
-- 错误示例
local parent = GUI:Win_Create("GMMain", 0, 0, 0, 0, false, false, true, false, false, false, 1)
local child = GUI:Widget_Create(parent, "my_widget", 100, 200, 300, 400)
-- 如果再次尝试添加到其他父节点会报错
GUI:Widget_Create(anotherParent, "my_widget", 100, 200, 300, 400) -- 这里会报错
```
2. **ListView重复插入**:
```lua
-- 错误示例
local listView = GUI:getChildByName(parent, "ListView_1")
local item = GUI:Widget_Create(nil, "item", 0, 0, 100, 100)
-- 重复插入同一个item
GUI:ListView_pushBackCustomItem(listView, item)
GUI:ListView_pushBackCustomItem(listView, item) -- 这里会报错
```
## 正确做法:
### 方案1:检查是否已添加
```lua
local parent = GUI:Win_Create("GMMain", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 创建子控件前先检查
if not GUI:Win_IsNull(parent) then
local child = GUI:Widget_Create(parent, "my_widget", 100, 200, 300, 400)
if GUI:Win_IsNull(child) then
SL:print("创建子控件失败")
end
end
```
### 方案2:ListView正确使用
```lua
-- 正确示例
local listView = GUI:getChildByName(parent, "ListView_1")
-- 每次插入新item都要创建新的控件
for i = 1, 5 do
local item = GUI:Widget_Create(nil, "item_" .. i, 0, 0, 100, 100)
GUI:ListView_pushBackCustomItem(listView, item)
end
```
### 方案3:使用缓存避免重复
```lua
-- 在模块顶部定义缓存表
local MyModule = {}
MyModule._createdWidgets = {}
function MyModule.createWidget()
if MyModule._createdWidgets["my_widget"] then
SL:print("控件已存在,不再重复创建")
return MyModule._createdWidgets["my_widget"]
end
local parent = GUI:Win_Create("GMMain", 0, 0, 0, 0, false, false, true, false, false, false, 1)
local widget = GUI:Widget_Create(parent, "my_widget", 100, 200, 300, 400)
MyModule._createdWidgets["my_widget"] = widget
return widget
end
```
## 调试建议:
检查你的代码中是否有以下情况:
1. 同一个控件被多次添加到不同的父节点
2. 在循环中没有创建新的控件实例
3. 函数被多次调用导致重复创建
如果还是找不到问题,可以把相关代码片段发给我,我帮你具体分析。记住,每个控件只能有一个父节点,这是引擎的硬性规定!
← 返回问答库