Por que minha referência de objeto é nula ao tentar fazer referência a um MX: Canvas do ActionScript?
-
26-09-2019 - |
Pergunta
Esta é uma pergunta de acompanhamento de Este, Não quero continuar nos comentários e impedir que as pessoas tenham reputação suada ... :)
Na minha classe de comando Cairngorm, para compilar, eu precisava dizer o que era mycanvas, então usei esta linha:
var myCanvas : MyCanvas = new MyCanvas;
Acho que isso está errado, porque, embora isso seja compilado, se eu tentar fazer algo assim:
if (myCanvas.subObject.value == 0) { ... }
Vai lançar este erro:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at com.foo.bar.command::MyCommand/execute()
Como se o subobjeto não existisse. Parece que eu posso estar recebendo uma nova instância de mycanvas, não a instância que eu quero do main.mxml com um id de mycanvas. Estou certo? Como faço para corrigir isso?
Editar (22:59 GMT+1): Ok, então parece que eu tenho sido muito vago aqui. Aqui está o meu main.mxml
:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:control="com.foo.bar.control.*"
xmlns:business="com.foo.bar.business.*"
xmlns:view="com.foo.bar.view.*"
applicationComplete="com.foo.bar.util.StartupUtil.init()"
horizontalScrollPolicy="off"
verticalScrollPolicy="off"
borderThickness="0"
paddingBottom="0"
paddingLeft="0"
paddingTop="0"
paddingRight="0"
>
<mx:Script>
<![CDATA[
import com.foo.bar.model.PlayerModelLocator;
[Bindable]
private var model : PlayerModelLocator = PlayerModelLocator.getInstance();
]]>
</mx:Script>
<!-- ========================================================================== -->
<!-- the ServiceLocator where we specify the remote services -->
<business:Services id="services" />
<!-- the FrontController, containing Commands specific to this application -->
<control:PlayerController id="controller" />
<!-- ========================================================================== -->
<mx:Style source="assets/main.css" />
<view:MyCanvas id="myCanvas" />
</mx:Application>
E aqui está o meu com/foo/bar/command/MyCommand.as
:
package com.foo.bar.command {
/* add to controller
addCommand( MyEvent.EVENT_CHANGE_VOLUME, ChangeVolumeCommand );
*/
import flash.net.SharedObject;
import com.adobe.cairngorm.control.CairngormEvent;
import com.adobe.cairngorm.commands.ICommand;
import com.foo.bar.model.PlayerModelLocator;
import com.foo.bar.event.MyEvent;
import com.foo.bar.view.*;
public class ChangeVolumeCommand implements ICommand {
public function execute(event:CairngormEvent):void {
var model : PlayerModelLocator = PlayerModelLocator.getInstance();
var myEvent : MyEvent = MyEvent(event);
var myCanvas : MyCanvas = new MyCanvas();
var so:SharedObject = SharedObject.getLocal("fixie.video");
if (myCanvas.subObject.value == 0) {
trace("subobject value is 0");
}
}
}
}
Basicamente, eu quero entender o objeto com id myCanvas
dentro main.mxml
usando o myCanvas
objeto em MyCommand.as
Solução
Qual é o escopo da sua variável mycanvas? Está dentro de um método em algum lugar? Você precisará torná -lo público ou dar -lhe getter/setter para poder acessá -lo.
Você também pode estar tentando fazer referência antes de ser adicionado ao seu pai, usando o método addChild ().
Realmente não há código suficiente em seus exemplos para determinar o problema, mas essas coisas devem dar a você um lugar para começar a procurar.
Outras dicas
Pode ser algumas coisas. Primeiro, você precisa de parênteses no nome da sua classe após a declaração "nova": new MyCanvas();
Segundo, você pode estar tentando acessar seu subcomponente antes que o ciclo de vida do componente esteja pronto para você fazê -lo. (É difícil dizer pelo código que você postou, pois não há contexto suficiente.)
1 maneira é adicionar EventListener quando suas mycanvas estarão prontas após a criação e fazer todas as suas coisas
E o segundo é: defina seu SubObject Como na aula MyCanvas, você poderá acessá -la no estágio init do seu componente.
Atenciosamente Eugene
PS o tempo todo, todos querem obter resposta sem amostra bem formada de seu problema, é terrível !!