0

我问的原因很简单,用户无法注销,因为 redux 的 store 仍然持有对RealmObject已删除实例的引用。

Realms 问题 1031中所述,向用户显示以下错误

访问已失效或删除的 X 类型对象

我正在使用与该问题相关的以下软件包:

  • “反应原生”:“^0.46.1”
  • “反应导航”:“^1.0.0-beta.11”
  • “反应减少”:“^5.0.5”
  • "领域": "^1.9.0",
  • "redux": "^3.7.0",
  • "redux-logger": "^3.0.6",
  • "redux-persist": "^4.8.2",
  • “redux-thunk”:“^2.2.0”

现在,我有一些 action 和 reducer 更新了 redux 的 store。当用户决定全部使用核武器时,我会表演以下舞蹈:

static logout() {
    try {
        // Remove everything from database
        RealmInstance.write(() => {
            RealmInstance.deleteAll();
        });
    } catch (ex) {
        if (__DEV__) {
            console.log(`Logout failed: ${ex.message}`);
        }
        return false;
    }

    return true;
};

以下函数调度结果

export function logoutUser() {
    return dispatch => {
        if (Account.logout()) {
            dispatch(logoutSuccess());
        } else {
            dispatch(logoutError());
        }
    }
}

对于每个减速器,我将状态重置为其初始状态:例如对于帐户减速器

export function accountReducer(state = { user: Account.User }, action) {
    switch (action.type) {
        case Types.SET_USER:
        case Types.GET_USER:
        case Types.LOGIN_USER_SUCCESS:
        case Types.LOGIN_USER_ERROR:
            return state; // for example
        case Types.LOGOUT_USER:
            return {
                ...initialUserState,
                loggedOut: action.loggedOut,
            };
        default:
            return state // for example
    }
}

对于导航减速器,我重置了路线并指向登录页面。这是一切重新开始的地方。

function nav(state = initNavState, action) {
    let nextState = null;

    // if (...) { ...
    } else if (action.type === 'LOGOUT_USER') {
        nextState = AppNavigator.router.getStateForAction(NavigationActions.reset(
            {
                index: 0,
                key: null,
                actions: [ NavigationActions.navigate({
                    routeName: 'Login'
                }) ]
            }
        ))
    } else {
        nextState = AppNavigator.router.getStateForAction(action, state);
    }

    // Simply return the original `state` if `nextState` is null or undefined.
    return nextState || state;
}

如果我是正确的,那么问题存在是因为您调用 dispatch(redux 的中间件/thunk 逻辑)在整个应用程序中传播信息。但据我了解,dispatch 调用的部分存储仍然包含对已删除RealmObject实例的引用。因此错误。

在堆栈跟踪中的某个地方,它指向dispatch(logoutSuccess());. 我应该使用另一种方法吗?我需要减速器反映注销命令,以便在调用调度程序之前重置它们的状态。

4

0 回答 0