AS3 / Flex - persistNavigatorState + объекты с ArrayCollection () - PullRequest
0 голосов
/ 02 апреля 2012

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

[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 в мобильном приложении?

1 Ответ

0 голосов
/ 03 апреля 2012

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

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

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

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

  • не устанавливатьСвойство данных представления изнутри представления, как вы делаете это сейчас в обработчике creationComplete
  • , если возможно, используйте свойство firstView для ViewNavigatorApplication в mxml
  • , если возможно, инициализируйте firstViewDataсвойство в mxml (может быть невозможным)
  • , если вы не можете выполнить два вышеупомянутых действия, в коде запуска вашего приложения вызовите navigator.pushView (View_Class_Name, foo) для передачи данных.
...