1

我在我的项目中使用 react-native-navigation 包和 Realm。我的应用程序有一个名为的领域对象Notebook,其中包含一个对象列表Verse,这些对象是另一个领域对象。

The structure of the app is very simple, the first page shows a list of Notebooks and when one is selected, the app transitions to the second screen which is a list of Verses.

这是我从笔记本列表导航到经文列表的代码:

this.props.navigator.push({
  screen: 'com.beyersapps.biblebinderrn.verselist',
  title: notebook.name,
  passProps: {notebook: notebook},
  animated: true,
  animationType: 'fade',
  backButtonTitle: undefined,
  backButtonHidden: false
})

此导航工作正常,我可以在两个屏幕之间来回移动。当我创建一个新的Verse并将其添加到Notebook. 这是我在第二个屏幕中创建新的代码Verse

realm.write(() => {
  let newVerse = realm.create('Verse', {
    reference: 'Genesis 1:1',
    favorite: false,
    memorized: false,
    scripture: 'My favorite verse'
  });

  if (this.notebook != null) {
    this.notebook.verses.push(newVerse);
  }
});

这就是我的问题开始的地方。此时,如果我选择后退按钮返回到Notebooks 列表,然后再次选择一个笔记本,我会收到此错误:

试图更改只读属性的值。

本机调用 java.lang.RuntimeException 中的异常:调用 RCTEventEmitter.receiveTouches 时出错

在 com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
在 android.os.Handler.handleCallback(Handler.java:751)
在 android.os.Handler.dispatchMessage(Handler.java:95)
在 com .facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
at android.os.Looper.loop(Looper.java:154)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run( MessageQueueThreadImpl.java:199)
at java.lang.Thread.run(Thread.java:761)
原因:com.facebook.jni.CppException:异常调用对象作为函数:TypeError:试图更改只读属性的值。
在 com.facebook.react.bridge.queue.NativeRunnable.run(本机方法) 
在 android.os.Handler.handleCallback(Handler.java:751) 
在 android.os.Handler.dispatchMessage(Handler.java:95) 
在 com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31 ) 
在 android.os.Looper.loop(Looper.java:154) 
在 com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:199) 
在 java.lang.Thread.run(Thread.java :761) 

我可以做一些事情来解决这个问题,但两者都会让我的应用程序毫无用处。因为它们可能有助于确定问题,尽管我可以在导航到新屏幕时删除{notebook: notebook}passPropsVerse列表屏幕上没有显示任何内容,因为它不知道Notebook选择了哪个)。或者,我无法将新创建的添加Verse到所选中Notebook(但我无法添加数据)。

由于这两个更改位于两个不同的组件(Realm 和 react-native-navigation)中,我不确定哪个组件是问题的根源。

4

1 回答 1

1

作为 props ( passProps) 传递的对象被 React Native 冻结。尝试改变:

passProps: {notebook: notebook}

至:

passProps: {notebook: _.cloneDeep(notebook)}

如果您需要反映对notebook上一个屏幕中的更改,我认为您应该通过商店进行。

notebookId另一种选择是通过 id 从 state传递并获取正确的 notebook。

于 2017-07-07T19:11:15.193 回答