React Native应用程序未按预期崩溃

时间:2019-09-03 13:13:11

标签: react-native crash

我们一直在调查应用程序中的问题,在该问题中,我们只会看到白屏,并且没有记录任何崩溃。适用于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

我们是否以为上面的代码会导致应用程序崩溃是错误的?

1 个答案:

答案 0 :(得分:0)

发现error-boundaries是丢失的部分。在根级别上实现错误边界,使我们能够将这些错误手动记录到崩溃处理系统中。

作为旁注,我还可以提到,如果您使用redux-saga并抛出错误,则默认情况下该错误似乎被吞没了。因此,如果要处理这些未捕获的错误,可以在onError

中实现createSagaMiddleware选项