RealmObject
私が尋ねている理由は簡単です。redux のストアは、既に削除されたインスタンスへの参照をまだ保持しているため、ユーザーはログアウトできません。
Realms の問題 1031で説明されているように、ユーザーに次のエラーが表示されます。
この問題に関連する次のパッケージを使用しています。
- "react-native": "^0.46.1"
- "react-navigation": "^1.0.0-beta.11"
- "react-redux": "^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"
これで、redux のストアが更新されるいくつかのアクションとレデューサーがあります。ユーザーがすべてを破壊することを決定したとき、私は次のダンスを行います。
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 のミドルウェア/サンク ロジック) を呼び出してアプリケーション全体に言葉を広めるために問題が存在します。しかし、私が理解している限り、dispatch は、既に削除されたRealmObject
インスタンスへの参照をまだ保持しているストアの一部を呼び出します。したがって、エラー。
スタックトレースのどこかで、それは を指していdispatch(logoutSuccess());
ます。私が使用すべき別のアプローチはありますか?ディスパッチャーが呼び出される前に状態がリセットされるように、リデューサーがログアウト コマンドを反映する必要があります。