NetInfo.addEventListener вызывается дважды, когда компонент монтируется в IOS - PullRequest
0 голосов
/ 06 марта 2020

Когда приложение запускается, вызывается componentDidMount, а затем дважды вызывается NetInfo.addEventListener. Есть какое-то решение этого. Мой код:

class OfflineMessage extends PureComponent {

    state = {
      isConnected: true
    };

  componentDidMount() {
    NetInfo.addEventListener((state) => {
      this.handleConnection(state.isConnected);
    });
  }

  componentWillUnmount() {
    NetInfo.removeEventListener((state) => {
      this.handleConnection(state.isConnected);
    });
  }

handleConnection = (isConnected) => {
  console.log('status-----', isConnected);
  this.setState({ isConnected });
};

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Я исправил свой код, теперь даже componentDidMount вызывается дважды, если состояние подключения изменилось, то будет выводиться только консоль. Раньше всякий раз, когда состояние подключения изменялось, оно печатало true, true, false, false.

class OfflineMessage extends PureComponent {

    state = {
      status: true
    };

  componentDidMount() {
    NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectionChange);
  }

  componentWillUnmount() {
    NetInfo.isConnected.removeEventListener('connectionChange', this.handleConnectionChange);
  }

  handleConnectionChange = (isConnected) => {
    const { status } = this.state;
    if (isConnected != status) {
      console.log("connection changes");
      NetInfo.isConnected.removeEventListener('connectionChange');
    } else {
      NetInfo.isConnected.removeEventListener('connectionChange');
    }
  }
0 голосов
/ 06 марта 2020

Это ожидаемое поведение в зависимости от страницы выпуска github. Вы не должны делать никаких предположений о том, когда и как часто вызывается ваше прослушивание, и вам следует ожидать различий между платформами. Это связано с тем, что каждая платформа работает по-разному, и мы отражаем это, а не пытаемся сделать все на 100% одинаковым.

Вероятно, это связано с тем, что меняется значение, отличное от isConnected, для пример типа сети. Мы запускаем событие всякий раз, когда система предоставляет некоторую новую информацию о сети, и передаем ее вам.

Если вы не хотите выполнять повторный рендеринг, когда информация одинакова, вы можете реализовать любой из них, используя componentShouldUpdate или путем управления состоянием в чем-то вроде Redux. Библиотека будет обновлять вас всякий раз, когда она получает и обновляет, и вы не должны делать предположения о том, как часто или когда она будет предоставлять их.

См.

См.

...