Expo React Native - как использовать ErrorRecovery? - PullRequest
0 голосов
/ 16 июня 2020

Текущие документы Expo ErrorRecovery не содержат примеров с использованием ErrorRecovery.setRecoveryProps().

Если вы знаете, как использовать Управляемый рабочий процесс , чтобы он ловит JS ошибки, дайте знать.

Спасибо

1 Ответ

1 голос
/ 10 июля 2020

Я попробовал:

import * as React from "react";
import { Text, View, StyleSheet } from "react-native";
import Constants from "expo-constants";
import { Button } from "react-native-paper";
import * as ErrorRecovery from "expo-error-recovery";

export default function App({ exp }) {
  return (
    <View style={styles.container}>
      <Text style={styles.paragraph}>{JSON.stringify(exp.errorRecovery)}</Text>
      <Button
        onPress={() => {
          ErrorRecovery.setRecoveryProps({ info: "User pressed crash button" });
          throw "Crash!";
        }}
      >
        Crash!
      </Button>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    paddingTop: Constants.statusBarHeight,
    backgroundColor: "#ecf0f1",
    padding: 8
  },
  paragraph: {
    margin: 24,
    fontSize: 18,
    fontWeight: "bold",
    textAlign: "center"
  }
});

При первоначальной загрузке приложения exp.errorRecovery будет нулевым. Если вы нажмете кнопку «Crash!» и перезагрузите, тогда exp.errorRecovery будет содержать все, что вы установили с помощью setRecoveryProps().

Я думаю, что вы можете использовать setRecoveryProps(), чтобы ваше приложение знало, что он разбился и, возможно, предоставит некоторый контекст о том, что произошло незадолго до Cra sh. Я никогда не использовал его, поэтому я не уверен, что это за хороший вариант использования. с подходом, показанным здесь (с использованием глобального обработчика ошибок), чтобы передать некоторую информацию о Cra sh в перезагруженное приложение:

import * as React from "react";
import { Text, View, StyleSheet } from "react-native";
import Constants from "expo-constants";
import { Button } from "react-native-paper";
import * as ErrorRecovery from "expo-error-recovery";

const defaultErrorHandler = ErrorUtils.getGlobalHandler();

const globalErrorHandler = (err, isFatal) => {
  console.log("globalErrorHandler called!");
  ErrorRecovery.setRecoveryProps({ info: err });
  defaultErrorHandler(err, isFatal);
};

ErrorUtils.setGlobalHandler(globalErrorHandler);

export default function App({ exp }) {
  return (
    <View style={styles.container}>
      <Text style={styles.paragraph}>{JSON.stringify(exp.errorRecovery)}</Text>
      <Button
        onPress={() => {
          throw "Crash!";
        }}
      >
        Crash!
      </Button>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    paddingTop: Constants.statusBarHeight,
    backgroundColor: "#ecf0f1",
    padding: 8
  },
  paragraph: {
    margin: 24,
    fontSize: 18,
    fontWeight: "bold",
    textAlign: "center"
  }
});
...