realm.js - 使用NO堆栈跟踪访问已失效或删除的Contact类型的对象

时间:2017-05-28 09:57:15

标签: react-native realm react-navigation

愿(真的)感谢这一点的帮助。
我有一个领域列表视图导航到详细视图。
详细视图是从原始列表视图中删除条目并导航回来。我已经在领域数据库更改上注册了监听器以更新列表视图的内容。
这是我正在使用的代码,在删除后得到一个例外 - 导航发生后“访问类型为Contact的对象已被无效或删除”。
有没有人知道为什么?
另外,似乎更改侦听器(updateContactsFromDB)被调用两次,而只删除一个对象 - 想法?

10倍

ContactPage.js:

export default class ContactsPage extends Component {
  updateContactsFromDB(){
    console.log("ContactsPage:updateContactsFromDB()");
    let contacts = Realm.objects('Contact');
    this.setState({
      dataSource: this.state.dataSource.cloneWithRows(contacts.snapshot()),
    });
  }
  constructor(props) {
    console.log("ContactsPage:constructor()");
    super(props);
    const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => (r1 !== r2)});
    let contacts = Realm.objects('Contact');
    this.state = {
      dataSource: ds.cloneWithRows(contacts.snapshot()),
    };
     this.updateContactsFromDB = this.updateContactsFromDB.bind(this);
  }
  componentWillMount(props){
    console.log("ContactsPage:componentWillMount");
    Realm.addListener('change', this.updateContactsFromDB);
  }
  componentWillUnmount(props){
    console.log("ContactsPage:componentWillUnmount");
    Realm.removeListener('change', this.updateContactsFromDB);
  }
  render() {
    console.log("ContactsPage:render()");
    return (
            <ListView
              dataSource={this.state.dataSource}
              renderRow={(contact) => (
                <TouchableOpacity onPress={ () => this.props.navigation.navigate('ContactNotesPage', { contact: contact}) }>
                  <Text>test Contact</Text>
                </TouchableOpacity>
              )
            }
            />
    );
  }
}

ContactNotesPage.js:

export default class ContactNotesPage extends Component {
  constructor(props) {
    console.log("ContactNotesPage:constructor");
    super(props);
  }
  render(){
    console.log("ContactNotesPage:render()");
    const { params } = this.props.navigation.state;
    return (
      <TouchableOpacity onPress={ () => {
          console.log("ContactNotesPage:delete");
            Realm.write(() => { Realm.delete(params.contact);});
            this.props.navigation.navigate('ContactsPage');
        }
       }>
      <Text>DeleteContact</Text>
      </TouchableOpacity>
    )
  }
};

// main.js
const MainStack = StackNavigator({
  ContactsPage: {
    screen: ContactsPage,
  },
  ContactNotesPage:{
    screen: ContactNotesPage,
  },
});

export default MainStack;

3 个答案:

答案 0 :(得分:2)

似乎它是领域/反应导航中的一个错误。传递作为领域对象的参数时 - 如果删除此对象,则下一个导航将失败。 已在https://github.com/realm/realm-js/issues/1031

打开错误

答案 1 :(得分:0)

当您从领域(使用realm.objects('collection'))获取对象并在其上使用realm.close()函数时,就会发生这种情况。使用Object.assign方法或销毁对象或数组方法可以缓解此问题。像下面一样,

const realmObject = realm.objects('collection');
const obj = [...realmObject] or {...realmObject[0]}; // the later one when filtered is used on realmObject.

我的解决方案是我没有调用realm.close(),因为我一直在使用数据库。

https://realm.io/docs/javascript/0.14.0/api/Realm.html#close

答案 2 :(得分:0)

在删除数组中的项目后,我使用@react-navigation/native 中的 useFocusEffect 来更新列表数组

//state to check get data ability: 

 const [getDataAbility, setGetDataAbility] = useState(true);        
  //useFocusEffect

   useFocusEffect(
      React.useCallback(() => {
           if (getDataAbility === true) {
            // handle data
           }
      }, [ dependencies... ]),
   );
 // catch error ""accessing obj of..."
 try {
       console.log(pickingItem.id);
   } catch (error) {
    setGetDataAbility(false);
    console.log('err picking: ', error);
   }

-> 解决