我问的原因很简单,用户无法注销,因为 redux 的 store 仍然持有对RealmObject
已删除实例的引用。
我正在使用与该问题相关的以下软件包:
- “反应原生”:“^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());
. 我应该使用另一种方法吗?我需要减速器反映注销命令,以便在调用调度程序之前重置它们的状态。