我们一直在调查应用程序中的问题,在该问题中,我们只会看到白屏,并且没有记录任何崩溃。适用于Android和iOS
问题似乎与异步/等待或诺言的使用有关。
我们发现使用async / await或promises可以在本地重现白屏问题。
可以使用以下代码来重现该问题(尝试将其尽可能简化)。将新项目中的App.js替换为以下内容:
import React, {Fragment} from 'react';
import {Text} from 'react-native';
class App extends React.Component {
state = {isMounted: false};
async componentDidMount() {
await Promise.resolve(1);
this.setState({isMounted: true});
}
render() {
if (this.state.isMounted) {
this.state.isMounted.test();
}
return (
<Fragment>
<Text>test</Text>
</Fragment>
);
}
}
export default App;
我还在github上推了test project
我希望该应用程序崩溃,因为isMounted
不包含test
方法。
在本地运行时,我得到一个红色框,表明发生了预期的错误
TypeError: this.state.isMounted.test is not a function. (In 'this.state.isMounted.test()', 'this.state.isMounted.test' is undefined)
This error is located at:
in App (at renderApplication.js:40)
in RCTView (at View.js:35)
in View (at AppContainer.js:98)
in RCTView (at View.js:35)
in View (at AppContainer.js:115)
in AppContainer (at renderApplication.js:39)
...
,但是运行发行版时,应用程序不会崩溃,也不会报告错误。由于我们完全是盲人,这使得我们很难找到并解决这样的问题。
如果我注释掉
await Promise.resolve(1);
它在发行版本中按预期崩溃
原生版本:0.60.5
我们是否以为上面的代码会导致应用程序崩溃是错误的?
答案 0 :(得分:0)
发现error-boundaries是丢失的部分。在根级别上实现错误边界,使我们能够将这些错误手动记录到崩溃处理系统中。
作为旁注,我还可以提到,如果您使用redux-saga并抛出错误,则默认情况下该错误似乎被吞没了。因此,如果要处理这些未捕获的错误,可以在onError
createSagaMiddleware
选项