如果 Loader 的 sourceComponent Item 引用了它的父项,并且我设置了 "loader.active = false",我会得到一个错误

If Loader's sourceComponent Item references its parent, and I set "loader.active = false", I get an error

我的代码:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    Item {
        id: loaderParent
        Loader {
            id: loader
            active: true
            sourceComponent: Item {
                parent: loaderParent
                x: parent.x
            }
        }
    }

    Item {
        focus: true
        Keys.onPressed: {
            loader.active = false;
        }
    }
}

当我按任意键时,出现此错误:

qrc:/main.qml:16: TypeError: Cannot read property of null

以为我怀疑这个错误是无害的,我想要一个解释或任何关于 fix/workaround 的想法?

已举报here

我找到了解决方法:不获取 parent.x,而是获取 loaderParent.x。还是想知道为什么会出现这个问题。

Loader 似乎在销毁时将项目父级设置为 null。 QML 对象不会立即删除,而是使用 deleteLater() 使对象在另一个事件循环周期中保持活动状态。

这会导致重新计算绑定表达式,这不再可能,因为父级现在为空。我遇到过更严重的这种行为 described here

避免它的一个简单方法是不使用您已经找到的父 属性,或者使用更复杂的绑定表达式,例如 x: loader.active ? parent.x : someFailsafeValue.

通过使用 onParentChanged: console.log(parent) 您可以验证当加载程序停用时父级确实更改为 null。