【问题标题】:AS3/Flex - persistNavigatorState + objects with ArrayCollection()AS3/Flex - persistNavigatorState + 带有 ArrayCollection() 的对象
【发布时间】:2012-04-02 18:33:02
【问题描述】:

我目前在 playbook 上有一个具有以下类的移动应用程序:

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

我的ViewNavigatorApplication 中也有persistNavigatorState="true"

假设在我的第一个视图中,我的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 类有什么想法吗?

【问题讨论】:

    标签: actionscript-3 apache-flex blackberry-playbook


    【解决方案1】:

    我不是 100% 确定,但我最近在开发移动应用时想知道这类问题。

    我相信您的问题可能发生在 b/c 您正在视图上手动设置数据,而不是使用 ViewNavigator.pushView() 方法将其传递到视图中。

    我刚刚浏览了源码,看起来直接在View上设置数据会绕过ViewNavigator的数据持久化。尽管话虽如此,但我不确定为什么它甚至会记住该字符串的值:)

    我会尝试执行以下操作:

    • 不要像现在在 creationComplete 处理程序中那样从视图内部设置视图的数据属性
    • 如果可能,在 mxml 中使用 ViewNavigatorApplication 的“firstView”属性
    • 如果可能,初始化mxml中的“firstViewData”属性(可能不行)
    • 如果以上两个都做不到,请在应用程序的启动代码中调用 navigator.pushView(View_Class_Name, foo) 来传入数据。

    【讨论】:

    • 我尝试了以上所有方法,但事情仍然以非常不稳定的方式工作。非常感谢,但我认为我最初的问题不是我面临的问题。现在更多的是让自定义对象保存在数据中(即 data.my_custom_object = some_custom_object),以便在手机关闭和打开时保存并保持。