2016-04-10 30 views
2

我試過AsyncStorage,react-native-store和react-native-simple-store,它們都在模擬器中工作,但不在設備上。我使用了redux和redux-thunk來加載存儲狀態。我調用下面的函數在我的根組件的componentDidMount方法(使用反應母語 - 簡單存儲):React Native:存儲只適用於模擬器

export function loadState() { 
    return (dispatch, getState) => { 
    store.get('state').then((state) => { 
     if (state) { 
     let action = { 
      type: LOAD_STATE, 
      state: fromJS(state), 
     }; 
     dispatch(action); 
     } else { 
     store.save('state', initialState); 
     } 
    }).catch((error) => { 
     console.log(error); 
    }); 
    }; 
} 

然後在我的減速,當用戶觸發更新,我會在返回之前更新存儲狀態像這樣的新狀態:

case SET_UPDATED_DATE: 
    newState = state.set('updatedDate', action.date); 
    store.update('state', newState.toJS()) 
    .catch((error) => console.log(error)); 
    return newState; 

初始化/更新方法是否不足?是否需要做一些特殊的事情來設置設備?或者在設備上運行時不支持redux-thunk - main.jsbundle或開發服務器 - (在loadState函數的返回函數的頂部放置一條日誌語句,可以讓我相信它在設備上時可能不會被調用)?

回答

0

AsyncStorage文檔的示例之後,我找到了一種使其工作的方法。在我的減速器文件(我的終極版狀態是Immutable.js對象):

var STORAGE_KEY = '@AppName:state'; 

export function loadState() { 
    return async (dispatch, getState) => { 
    try { 
     var value = await AsyncStorage.getItem(STORAGE_KEY); 
     if (value !== null) { 
     dispatch(replaceState(value)); 
     console.log('Recovered selection from disk:'); 
     console.log(value); 
     } else { 
     saveState(JSON.stringify(initialState.toJS())); 
     console.log('No state on disk. Initialized with initialState.'); 
     } 
    } catch (error) { 
     console.log('AsyncStorage error: ' + error.message); 
    } 
    }; 
} 

function replaceState(newState) { 
    return { 
    type: REPLACE_STATE, 
    newState: fromJS(JSON.parse(newState)), 
    }; 
} 

async function saveState(state) { 
    try { 
    await AsyncStorage.setItem(STORAGE_KEY, state); 
    console.log('Saved selection to disk:'); 
    console.log(state); 
    } catch (error) { 
    console.log('AsyncStorage error: ' + error.message); 
    } 
} 

然後在減速功能:

case SET_UPDATED_DATE: 
    newState = state.set('updatedDate', action.date); 
    saveState(JSON.stringify(newState.toJS())); 
    return newState; 
相關問題