Как проверить доступность интернета в React-native?

Я пробовал @ реагировать-нативное сообщество /netinfo, чтобы проверить доступность Интернета. Но сценарий, который я хочу реализовать, состоит в том, предположим, что если мое устройство подключено к точке доступа Wi-Fi с другого устройства и если мобильные данные этого устройства отключены, я хочу показать автономный тост.

componentDidMount() {
 NetInfo.addEventListener(status => {
  this.props.checkOnlineStatus(
    status.isConnected,
    status.isInternetReachable
  );
  this.setState({
    isConnected: status.isConnected,
    isInternetReachable: status.isInternetReachable
  });
 });
}

render() {
 if (!this.state.isInternetReachable && this.props.isOfflineNoticeVisible) {
  return <MiniOfflineSign />;
 }
 return null;
}

Но в этом случае, когда мобильные данные другого устройства отключены, оно не обрабатывает изменения.

3 ответа

Не устаревший способ (с использованием функциональных компонентов) с @react-native-community/netinfo пакет сейчас:

      import React, { useEffect } from "react";
import NetInfo from "@react-native-community/netinfo";
        useEffect(() => {
    return NetInfo.addEventListener(state => {
      // use state.isInternetReachable or some other field
      // I used a useState hook to store the result for use elsewhere
    });
  });

Это будет запускать обратный вызов при изменении состояния и отменять подписку при отключении компонента.

Эти типы подключения могут помочь: https://github.com/react-native-community/react-native-netinfo

В противном случае:

Тогда, чтобы быть уверенным, что вы в сети, просто выполните выборку с тайм-аутом:

 export default function(url, options, timeout = 5000) {
      return Promise.race([
        fetch(url, options),
        new Promise((_, reject) => setTimeout(() => reject("timeout"), timeout)),
      ]);
    }

Тогда используйте это так:

fetchWithTimeout(url, options)
        .then(resp => {
          if (resp.status === 200) {
            let json = resp.json().then(j => {
              return j;
            });
        })
        .catch(ex => {
          // HANDLE offline usage
          if (ex === "timeout") return true;
          //ANY OTHER CASE RETURN FALSE
          return false;
}

async function InternetCheck() {
    const connectionInfo = await NetInfo.getConnectionInfo();
    if (connectionInfo.type === 'none') {
        alert('PLEASE CONNECT TO INTERNET');
    } else {
            //navigate to page or Call API
    }
}

Другие вопросы по тегам