创建新的Realm对象后导航出错

时间:2017-07-07 12:48:48

标签: android react-native navigation realm react-native-navigation

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

应用程序的结构非常简单,第一页显示Notebook的列表,当选择一个时,应用程序将转换到第二个屏幕,即Verse的列表。

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

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);
  }
});

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

  

尝试更改只读属性的值。

     

本机通话中的例外情况                                                                     java.lang.RuntimeException:调用RCTEventEmitter.receiveTouches

时出错      

at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
  在android.os.Handler.handleCallback(Handler.java:751)
  在android.os.Handler.dispatchMessage(Handler.java:95)
  at 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)
  引起:com.facebook.jni.CppException:异常调用对象为函数:TypeError:尝试更改只读属性的值。
  at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
  在android.os.Handler.handleCallback(Handler.java:751)
  在android.os.Handler.dispatchMessage(Handler.java:95)
  at 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}移除passProps(但是Verse列表屏幕上没有显示任何内容,因为它不知道已选择Notebook。或者,我无法将新创建的Verse添加到选定的Notebook(但我无法添加数据)。

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

1 个答案:

答案 0 :(得分:1)

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

passProps: {notebook: notebook}

为:

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

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

另一种选择是通过notebookId并从州获取正确的笔记本。