0

RealmObject私が尋ねている理由は簡単です。redux のストアは、既に削除されたインスタンスへの参照をまだ保持しているため、ユーザーはログアウトできません。

Realms の問題 1031で説明されているように、ユーザーに次のエラーが表示されます。

無効化または削除されたタイプ X のオブジェクトへのアクセス

この問題に関連する次のパッケージを使用しています。

  • "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());ます。私が使用すべき別のアプローチはありますか?ディスパッチャーが呼び出される前に状態がリセットされるように、リデューサーがログアウト コマンドを反映する必要があります。

4

0 に答える 0