首页 文章

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

提问于
浏览
1

我在我的项目中使用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中的异常:在android.os.Handler.handleCallback(Handler.java:751)上的com.facebook.react.bridge.queue.NativeRunnable.run(本机方法)中调用RCTEventEmitter.receiveTouches时出错.os.Handler.dispatchMessage(Handler.java:95)位于android.os.Looper.loop(Looper.java:154)的com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31) java.lang.Thread.run中的com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 3.run(MessageQueueThreadImpl.java:199)(Thread.java:761)引起:com.facebook.jni.CppException:异常调用对象as function: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位于android.os.Looper.loop(Looper.java:154)的.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)at com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 3.run( MessageQueueThreadImpl.java:199)在java.lang.Thread.run(Thread.java:761)

我可以采取一些措施来解决这个问题,但这两个问题都让我的应用无用 . 虽然我可以帮助确定问题,但是当我导航到新屏幕时我可以从 passProps 删除 {notebook: notebook} (但是后来 Verse 列表屏幕上没有显示任何内容,因为它不知道选择了哪个 Notebook ) . 或者,我无法将新创建的 Verse 添加到所选的 Notebook (但我无法添加数据) .

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

1 回答

  • 1

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

    passProps: {notebook: notebook}
    

    至:

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

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

    另一种选择是传递 notebookId 并从状态获取正确的笔记本 .

相关问题