使用: React Native with expo
react-redux:5.0.6
redux:3.7.2
firebase:4.9.0
(见下面的修正:降级到firebase 4.6.2)
更新:这是一个较长的问题,基于怀疑redux与firebase不能很好地协作。但事实似乎并非如此。只保留相关部分
这是一个与redux连接的动作创建者。
在这里使用 String [] permissions1 = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION };
ActivityCompat.requestPermissions(MainActivity.this,permissions1,1);
TimerTask task = new TimerTask() {
@Override
public void run() {
Log.d(LOG_TAG,"request storage permission");
String [] permissions2 = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE };
ActivityCompat.requestPermissions(MainActivity.this,permissions2,2);
}
};
Timer timer = new Timer();
timer.schedule(task, 2000);
时,一切正常。
action.js
firebase.auth().signInWithEmailAndPassword()
但是当使用import firebase from 'firebase'
import 'firebase/firestore'
export const dataFetch = () => {
return (dispatch) => {
firebase.auth().signInWithEmailAndPassword('a@b.com', 'passw')
.then(
(result => dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result })),
(() => alert("got here"))
)
.catch((err) => alert(err))
}
};
时,执行不会进入firebase.firestore().collection(...).get()
部分 - 无法在其中记录任何内容。
then()
可能是什么问题? 是否有特定的方式来传递收集路径? firebase配置可能不正确吗?我仔细检查了一切。我正在使用配置为Web应用程序。是否存在可能丢失的特定于firestore的内容?
我的firebase配置中有以下键:
import firebase from 'firebase'
import 'firebase/firestore'
export const dataFetch = () => {
return (dispatch) => {
firebase.firestore().collection('MyCollection').get()
.then(
(result => dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result })),
(() => alert("got here"))
)
.catch((err) => alert(err))
}
};
答案 0 :(得分:1)
不太确定你的代码中发生了什么,但是这种自我调用功能似乎有点不合适?重新格式化您的代码,使其对我自己更具可读性。
你可以看到你忘了在"结果" -block +上关闭}自我调用函数没有意义吗?当你已经有一个catch块时,为什么要尝试捕获那里的错误?
export const dataFetch = () => {
return (dispatch) => {
firebase.firestore().collection('MyCollection').get()
.then((result => {
dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result }),
(() => { alert("got here"); })
)
.catch((err) => {
alert(err);
});
};
};
无论哪种方式,这应该有效:
export function dataFetch (){
const request = firebase.firestore().collection(`MyCollection`).get()
return (dispatch) => {
return request.then((result) => {
dispatch({ type: 'DATA_FETCH_SUCCESS', payload: result})
}).catch((error)=> {
console.log({error})
})
}
}
不确定signInWithEmailAndPassword是如何以及是否确实有效。
答案 1 :(得分:1)
好的,所以搜索了很多,发现这是一个与firestore无法使用世博会相关的问题! (更新了问题的标题以反映这一点)。
没有稳定的解决方法,但其他人已经面临这个问题,这里有一个解决方法,请检查Igor的回答: In react native app (through Expo) using firestore permissions - request.auth is always null
问题出在React Native中,这里已经讨论过了: https://github.com/firebase/firebase-js-sdk/issues/283#issuecomment-345815579
希望它能很快进入正式版本。
仅供参考,我降级到firebase 4.6.2并替换了上面链接中提到的index.js文件,现在情况正常。