AS3/Flex — persistNavigatorState + объекты с ArrayCollection()

В настоящее время у меня есть мобильное приложение в playbook со следующим классом:

[Bindable]
public class Foo
{
    public var myString:String;
    public var myList:ArrayCollection;
    public function Foo() {} 
}

У меня также есть persistNavigatorState="true" в моем ViewNavigatorApplication.

Предположим, в моем первом представлении у меня есть следующее в моем вызове creationComplete="init()":

private function init():void {
    var s:String = "test_string";
    var a:ArrayCollection = new ArrayCollection();
    a.addItem("test1");
    a.addItem("test2");
    a.addItem("test3");

    data.foo = new Foo();
    data.foo.myString = s;
    data.foo.myList = a;

    trace(data.foo.myString);
    trace(data.foo.myList[0]);
    trace(data.foo.myList[1]);
    trace(data.foo.myList[2]);
}

При выполнении в моем приложении все работает нормально. Однако, поскольку я хочу, чтобы сеансы сохранялись на случай, если пользователь случайно закроет приложение, когда он снова откроет его, данные все еще должны быть там.

Вместо этого, когда я закрываю и снова открываю свое приложение, сохраняется только свойство myString (т. е. отслеживает «test_string», как и предполагалось), однако ArrayCollection не копируется.

Я пробовал следующее с ObjectUtil.clone() и ObjectUtil.copy():

data.foo.myString = ObjectUtil.copy(s) as String;
data.foo.myList = ObjectUtil.copy(a) as ArrayCollection;

и я также пробовал:

var f:Foo = new Foo();
f.myString = s;
f.myList = a;
data.foo = ObjectUtil.copy(f) as Foo;
trace(data.foo.myString);
trace(data.foo.myList[0]);

но это только бросает меня

TypeError: Ошибка № 1009: невозможно получить доступ к свойству или методу нулевой ссылки на объект.

Любые идеи о том, как сохранить класс ArrayCollections и Foo в мобильном приложении?


person Joseph Wong    schedule 02.04.2012    source источник


Ответы (1)


Я не уверен на 100%, но недавно я задавался вопросом об этой проблеме, работая над мобильным приложением.

Я полагаю, что ваша проблема может возникнуть из-за того, что вы вручную устанавливаете данные в представлении вместо того, чтобы передавать их в представление с помощью метода ViewNavigator.pushView().

Я только что просмотрел источник, и похоже, что установка данных непосредственно в представлении обойдет сохранение данных ViewNavigator. Хотя с учетом сказанного, я не уверен, почему он вообще помнит значение для этой строки :)

Я бы попробовал сделать следующее:

  • не устанавливайте свойство данных представления изнутри представления, как вы делаете сейчас в обработчике createComplete
  • если возможно, используйте свойство firstView приложения ViewNavigatorApplication в mxml.
  • если возможно, инициализируйте свойство "firstViewData" в mxml (может быть невозможно)
  • если вы не можете сделать два вышеперечисленных, в коде запуска вашего приложения вызовите navigator.pushView(View_Class_Name, foo) для передачи данных.
person Sunil D.    schedule 02.04.2012
comment
Я попробовал все вышеперечисленное, и все еще работает очень шатко. Очень признателен, но я думаю, что мой первоначальный вопрос не был проблемой, с которой я столкнулся. Прямо сейчас это больше касается сохранения пользовательских объектов в данных (например, data.my_custom_object = some_custom_object) для сохранения и сохранения при выключении и включении мобильного телефона. - person Joseph Wong; 05.04.2012