创建新的 Realm 对象后导航出错
Error in navigation after creating new Realm object
我在我的项目中使用了 react-native-navigation 包和 Realm。我的应用程序有一个名为 Notebook
的领域对象,其中包含一个 Verse
对象列表,这些对象是另一个领域对象。
应用程序的结构非常简单,第一页显示 Notebook
的列表,当 selected 时,应用程序转换到第二个屏幕,这是一个列表Verse
s.
这是我从笔记本列表导航到诗歌列表的代码:
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);
}
});
这是我的问题开始的地方。此时,如果我 select 后退按钮返回到 Notebook
的列表,然后再次 select 一个笔记本,我得到这个错误:
Attempting to change value of a readonly property.
Exception in native call
java.lang.RuntimeException: Error calling RCTEventEmitter.receiveTouches
at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at 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.run(MessageQueueThreadImpl.java:199)
at java.lang.Thread.run(Thread.java:761)
Caused by: com.facebook.jni.CppException: Exception calling object as function: TypeError: Attempting to change value of a readonly property.
at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at 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.run(MessageQueueThreadImpl.java:199)
at java.lang.Thread.run(Thread.java:761)
我可以做一些事情来解决这个问题,但两者都会让我的应用程序无用。因为他们可能有助于确定问题,虽然我可以在导航到新屏幕时从 passProps
中删除 {notebook: notebook}
(但是 Verse
列表屏幕上没有任何显示,因为它不知道其中 Notebook
是 selected)。或者,我无法将新创建的 Verse
添加到 selected Notebook
中(但我无法添加数据)。
由于这两个更改在两个不同的组件(Realm 和 react-native-navigation)中,我不确定哪个组件是问题的根源。
作为 props (passProps
) 传递的对象被 React Native 冻结。
尝试更改:
passProps: {notebook: notebook}
至:
passProps: {notebook: _.cloneDeep(notebook)}
如果您需要在上一屏幕中反映对 notebook
的更改,我认为您应该通过商店进行。
另一种选择是传递 notebookId
并通过 id 从 state 获取正确的笔记本。
我在我的项目中使用了 react-native-navigation 包和 Realm。我的应用程序有一个名为 Notebook
的领域对象,其中包含一个 Verse
对象列表,这些对象是另一个领域对象。
应用程序的结构非常简单,第一页显示 Notebook
的列表,当 selected 时,应用程序转换到第二个屏幕,这是一个列表Verse
s.
这是我从笔记本列表导航到诗歌列表的代码:
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);
}
});
这是我的问题开始的地方。此时,如果我 select 后退按钮返回到 Notebook
的列表,然后再次 select 一个笔记本,我得到这个错误:
Attempting to change value of a readonly property.
Exception in native call java.lang.RuntimeException: Error calling RCTEventEmitter.receiveTouches
at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at 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.run(MessageQueueThreadImpl.java:199)
at java.lang.Thread.run(Thread.java:761)
Caused by: com.facebook.jni.CppException: Exception calling object as function: TypeError: Attempting to change value of a readonly property.
at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at 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.run(MessageQueueThreadImpl.java:199)
at java.lang.Thread.run(Thread.java:761)
我可以做一些事情来解决这个问题,但两者都会让我的应用程序无用。因为他们可能有助于确定问题,虽然我可以在导航到新屏幕时从 passProps
中删除 {notebook: notebook}
(但是 Verse
列表屏幕上没有任何显示,因为它不知道其中 Notebook
是 selected)。或者,我无法将新创建的 Verse
添加到 selected Notebook
中(但我无法添加数据)。
由于这两个更改在两个不同的组件(Realm 和 react-native-navigation)中,我不确定哪个组件是问题的根源。
作为 props (passProps
) 传递的对象被 React Native 冻结。
尝试更改:
passProps: {notebook: notebook}
至:
passProps: {notebook: _.cloneDeep(notebook)}
如果您需要在上一屏幕中反映对 notebook
的更改,我认为您应该通过商店进行。
另一种选择是传递 notebookId
并通过 id 从 state 获取正确的笔记本。