Класс для взаимодействия с вк апи

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
Ответить
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Класс для взаимодействия с вк апи

Сообщение Agiliter »

Добрый день!
Продолжаю разрабатывать своё простенькое приложение. С визуальной частью пока нормально, и я решил заняться взаимодействием приложения с контактовским апи. Для начала попробовал простые методы, аля вывести имя и фото юзера, список друзей и скинуть сообщение на стену. Всё нормально отработало. Решил перенести код в отдельный класс, дабы в мэйне было почище, ну и по другим соображениям. Создал класс AgentVK, который должен взаимодействовать в апи вк. Однако напоролся на ошибку: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null"
Главный класс

Код: Выделить всё

package  {//=====================================================================================================================     // Проверить потом все библиотеки    import flash.display.Sprite;    import flash.events.*;//=====================================================================================================================     public class Main extends Sprite     {        private var myGame:MyGame;//=====================================================================================================================         public function Main()         {            trace("Запущен класс Main");            newGame();          }//=====================================================================================================================             public function newGame():void        {            myGame = new MyGame();            addChild(myGame);        }//=====================================================================================================================     }//===================================================================================================================== }
Собственно класс игры:

Код: Выделить всё

package  {//=====================================================================================================================    // Проверить потом все библиотеки и убрать лишние    import flash.display.Sprite;    import flash.events.EventDispatcher;    import flash.events.IEventDispatcher;    import flash.utils.*;//=====================================================================================================================    public class MyGame extends Sprite     {        private var myGameView:MyGameView; // Объект класса визуализации приложения        private var agentVK:AgentVK;                // Объект класса-посредника с вк апи//=====================================================================================================================             public function MyGame()         {            trace("Запущен класс MyGame");            newGameView();            newAgentVK();        }//=====================================================================================================================         public function newGameView():void        {            trace("MyGame вызывает newGameView");            myGameView = new MyGameView();            addChild(myGameView);  // Добавляем представление в список отображения        }//=====================================================================================================================        public function newAgentVK():void        {            trace("MyGame вызывает AgentVK");            agentVK = new AgentVK();        }//=====================================================================================================================     }//=====================================================================================================================}
И класс посредника с вк апи:

Код: Выделить всё

package  {    import flash.display.Sprite;    import vk.APIConnection;    import flash.events.*;        import vk.events.*;    import vk.ui.VKButton; //=====================================================================================================================     public class AgentVK extends Sprite     {        private var VK:APIConnection;// Флэшварсы передаются на флешку только, когда флэшка на сайте        private var flashVars:Object;        private var firstName:String;//=====================================================================================================================                 public function AgentVK()         {            trace("Запущен класс AgentVK");            //addEventListener(Event.ADDED_TO_STAGE, startApplication (e:Event){ flashVars = stage.loaderInfo.parameters as Object;})            flashVars = stage.loaderInfo.parameters as Object;// Данные передаются только, когда флэшка на сайте            trace("Ошибка!");            //--------------------------------------------------            if (!flashVars.api_id)            {                trace("local testing");// -- Your code for local testing:flashVars['api_id'] = 4169882;flashVars['viewer_id'] = 99999999;// Айди другой =)flashVars['sid'] = "e39a6261ba1586b364190733fb27257d1b1086faa434f29acac6b17fc912212c846681a249c555271ccfc";flashVars['secret'] = "6ccaee0bf2";// -- //            }            //--------------------------------------------------                VK = new APIConnection(flashVars);            VK.api('getProfiles', { uid:flashVars['viewer_id'],fields:'photo_big' }, onUserProfileLoaded, onApiRequestFail);            VK.api('friends.get', { fields: 'first_name, last_name, photo' }, onUserFriendsLoaded, onApiRequestFail);                       //VK.api('wall.post', { message: 'Я начал проходить тест http://vk.com/app4195510' }, wallPostSuccess, wallPostFail);        }//=====================================================================================================================         private function wallPostSuccess(data: Object): void         {            trace("Success wall.post post_id: " + data.post_id.toString() + "\n");            //tf.appendText("Success wall.post post_id: "+data.post_id.toString()+"\n");        }//---------------------------------------------------------------------------------------------------------        private function wallPostFail(data: Object): void         {            trace("Fail wall.post error_msg: "+data.error_msg+"\n");            //tf.appendText("Fail wall.post error_msg: "+data.error_msg+"\n");        }//---------------------------------------------------------------------------------------------------------        private function onUserPhotosLoaded(data:Object):void        {            trace("------------------------------");             trace("Photos = " + data);             //friends_text.text = "" + data;            trace("------------------------------");         }//---------------------------------------------------------------------------------------------------------         private function onUserFriendsLoaded(data:Object):void        {            //trace("Friends = " + data);             trace("FriendsPhoto = " + data[0]['photo']);             trace("Size = " + data.length);             for (var i:int = 0; i < data.length; i++ )            {                trace("FriendsName N "+ (i+1) +": " + data[i]['first_name'] + " " + data[i].last_name);                 }        }//---------------------------------------------------------------------------------------------------------         private function onUserProfileLoaded(data:Object):void        {            firstName = data[0].first_name;            trace("WHAT "+data[0].photo_big);            //trace(data[0].uid);        }//---------------------------------------------------------------------------------------------------------         private function onUserSettingsLoaded(data:Object):void        {            trace("Settings = " + data); // data - число        }//---------------------------------------------------------------------------------------------------------             // ошибка при обращении к серверу api        private function onApiRequestFail(data:Object):void        {            //trace("Ошибка при обращении к серверу api");            trace(data.error_msg);        }            } }
Прочие классы здесь не привожу, ибо не по теме. Хотя изуализация тоже перестала работать (трейсами пишет, а на сцене всё белым бело), если, конечно, не закоментить строчку

Код: Выделить всё

private var agentVK:AgentVK;
Но тут дело всё же, походу, в реализации класса AgentVK. Как я понимаю, ошибка говорит, что свойство stage объекта flashVars равно null? Объясните, пожалуйста, как поправить)
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Класс для взаимодействия с вк апи

Сообщение alexandr_ratush »

Вы наследуете ваш AgentVK от Sprite, но этого не нужно. Этот класс же не относится к визуальным, а простой менеджер, который я бы расширил от EventDispatcher, и в него передавал не stage, а уже готовый объект со свойствами, в которых данные ВК. А ошибка возникает, потому что ваш класс AgentVK не добавляется в список отображения, и поэтому у него stage = null. Или же подпишите его на событие Event.ADDED_TO_STAGE, и в обработчике считывайте данные с stage.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Класс для взаимодействия с вк апи

Сообщение Agiliter »

alexandr_ratush писал(а):Вы наследуете ваш AgentVK от Sprite, но этого не нужно. Этот класс же не относится к визуальным, а простой менеджер, который я бы расширил от EventDispatcher, и в него передавал не stage, а уже готовый объект со свойствами, в которых данные ВК. А ошибка возникает, потому что ваш класс AgentVK не добавляется в список отображения, и поэтому у него stage = null. Или же подпишите его на событие Event.ADDED_TO_STAGE, и в обработчике считывайте данные с stage.
Первый вариант мне кажется более логичным. Может примерно написать как в этом случае заменить строчки:

Код: Выделить всё

flashVars = stage.loaderInfo.parameters as Object;VK = new APIConnection(flashVars); 
Ну или хотя бы примерчик какой. А там уж попробую разобраться.
Но если не трудно, то лучше пример по делу. Как конкретно в данном случае.
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Класс для взаимодействия с вк апи

Сообщение alexandr_ratush »

Не понял чей первый вариант ваш или мой? :D
Вот набросал пример.

Главный класс:

Код: Выделить всё

package  {    import flash.display.MovieClip;        public class Main extends MovieClip {                private var _agentVK:AgentVK;                        public function Main() {            var flashVars:Object = stage.loaderInfo.parameters as Object;                        // Локальный запуск            if (!flashVars.api_id) {                flashVars.api_id = 'xxxxxxxxxxx';                flashVars.viewer_id = 'xxxxxxxxxx';                flashVars.secret = 'xxxxxxxxxxxxxxxx';                flashVars.sid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';                flashVars.api_url = 'http://api.vkontakte.ru/api.php';            }                        // Инициализация             _agentVK = new AgentVK(flashVars);            _agentVK.getProfiles('first_name, last_name, photo, country, online', loadProfilesData, onError);        }                private function loadProfilesData(response:Object):void {            traceObject(response);        }                // если произошла ошибка        private function onError(response:Object):void {            traceObject(response);        }                /**         * Function traces key and value data of Object         * @param   data Object data         * @param   sPrefix String separator         */        private function traceObject(data: Object, sPrefix: String = ''):void {            sPrefix == '' ? sPrefix = '-' : sPrefix += '---';                            for ( var i:* in data ) {                  trace(sPrefix , i + ' => ' + data[i], '  ');                   if (typeof( data[i] ) == 'object') traceObject ( data[i], sPrefix );             }        }            }}
Менеджер:

Код: Выделить всё

package  {    import flash.events.EventDispatcher;    import vk.APIConnection;        public class AgentVK extends EventDispatcher {                private var VK:APIConnection;        private var _api_id:String;        private var _viewer_id:String;        private var _sid:String;        private var _secret:String;                        // В параметре наши данные пользователя ВК для работы класса APIConnection        public function AgentVK(data:Object) {            _api_id =       data.api_id;            _viewer_id =    data.viewer_id;            _sid =          data.sid;            _secret =       data.secret;                        // инициализацыя            VK = new APIConnection(data);        }                public function getProfiles(fields:String, callbackLoad, callbackError):void {            var data:Object = { uid: _viewer_id, fields: fields };            VK.api('getProfiles', data, callbackLoad, callbackError);        }     }} 
Ответить