vovgou / loxodon-framework

An MVVM & Databinding framework that can use C# and Lua to develop games
MIT License
1.86k stars 363 forks source link

InteractionTargetProxy的Target被意外释放 #39

Closed ChaosVan closed 3 months ago

ChaosVan commented 3 months ago

TargetProxyBase中的target是一个WeakReference,target是LuaTable的时候,有时会意外变成null。业务那边是将一个View中异步的InteractionAction和VM中异步的InteractionRequest做绑定

bindingSet:Bind(self):For("gameAlertAsyncInteractionAction"):To("testAsyncInteractionRequest")
function M:TestInteractionRequest()
    self.testCommand.Enabled = false
    Executors.RunLuaOnCoroutineNoReturn(async(function()
        local notification = GameAlertNotification("未知事件", "事件类型未知", "确定")
        await(self.testAsyncInteractionRequest:Raise(notification))
        self.testCommand.Enabled = true
        log.debug(notification.DialogResult)
    end))
end

image image

请大神帮忙看看问题~感谢

vovgou commented 3 months ago

以前SimpleCommand有同样的问题,所以SimpleCommand构造函数有一个参数keepStrongRef可以确保是强引用类型,Command中的Action是一个lua对象是正常的。但是你这里的Target,应该是一个视图界面上的对象(UGUI控件、Window或者View对象),如果视图界面存在,就不应该被释放,如果视图不存在了,那么就应该正常解除绑定了。你查查你这绑定的这个target是不是生命周期没管理好,它应该与你的视图是一致的。另外一般来说也不应该是一个lua对象啊

ChaosVan commented 3 months ago

target是Lua那边的一个View对象,也就是下面绑定代码中的self,gameAlertAsyncInteractionAction是一个AsyncLoadableInteractionActionBase对象,testAsyncInteractionRequest是一个AsyncInteractionRequest 对象。

bindingSet:Bind(self):For("gameAlertAsyncInteractionAction"):To("testAsyncInteractionRequest")

另外,如果我将InteractionAction和InteractionRequest都换成同步的,将UIPrefab放在Resources中,就不会出现target为空的情况(关于这点我还在继续测试),我再多尝试几种绑定方式看看。

ChaosVan commented 3 months ago

好像破案了...Bind的时候,不加那个self就好了,CreateBindingSet的时候创建的LuaBindingSet里的target是C#的对象

bindingSet:Bind():For("gameAlertAsyncInteractionAction"):To("testAsyncInteractionRequest")

感谢大神解惑~

vovgou commented 3 months ago

好的,解决了就好,有问题在QQ群里面问我吧,沟通起来比较快! 622321589