должно отображаться при отсутствии сетевого подключения, но это не так

#reactjs #ionic-framework #capacitor #ionic-react

Вопрос:

Я работаю над Ionic React Project приложением , работающим поверх Capacitor , и мне нужно показывать всплывающее сообщение <IonToast> каждый раз, когда нет подключения к Интернету. Чтобы получить информацию о сети и подключении, я использую Network Capacitor Plugin : https://capacitorjs.com/docs/apis/network Я использую контекстный крючок для использования реквизита везде в приложении.

В MyContext.tsx я объявил необходимые константы следующим образом:

 const [showToast, setShowToast] = useState<boolean>(false);
  const [toastMessage, setToastMessage] = useState("");
 

На главной странице.tsx:

 import {
  IonContent,
  IonPage,
  IonButton,
  IonGrid,
  IonRow,
  IonCol,
  IonAlert,
  IonToast,
} from "@ionic/react";
import React, { useState, useEffect, useRef } from "react";
import { Network } from "@capacitor/network";

const HomePage: React.FC = () => {
  const {
    firstName,
    setFirstName,
    showToast,
    setShowToast,
    toastMessage,
    setToastMessage,
  } = React.useContext(MyContext);
  const history = useHistory();
  const mounted = useRef(true);

  //Check internet connection status
  useEffect(() => {
    mounted.current = true;
    const logCurrentNetworkStatus = async () => {
      const status = await Network.getStatus();
      if (mounted.current) {
        if (status.connected) {
          setShowToast(false);
        } else {
          setShowToast(true);
          setToastMessage("No internet connection");
        }
      }
    };
    return () => {
      logCurrentNetworkStatus();
      mounted.current = false;
    };
  }, []);

  console.log("showToast is "   showToast);
  console.log("Toast message is "   toastMessage);


  return (
    <React.Fragment>
      <IonPage className="ion-page" id="main-content">
        <IonContent className="ion-padding">
          <IonGrid>
            <IonRow>
              <IonCol>
                <IonToast
                  isOpen={showToast}
                  onDidDismiss={() => setShowToast(false)}
                  message={toastMessage}
                  position="top"
                  buttons={["Ok"]}
                />
              </IonCol>
            </IonRow>

                  <h5 className="text-center">Welcome to home page</h5>
                
          </IonGrid>
        </IonContent>
      </IonPage>
    </React.Fragment>
  );
};

export default HomePage;
 

Моя проблема в том, что всплывающее сообщение вообще не отображается. Я вошел showToast в систему, и его значение всегда равно false, даже если у меня нет подключения к Интернету в моем эмуляторе Android (showToast должен быть установлен в значение true).

В консоли я вижу результат Network.getStatus :

 result Network.getStatus
connected: false
 

Похоже, что функция useEffect() вообще не выполняется. Я добавил некоторую консоль.войдите в useEffect (), и ни один из них не был показан в консоли при отображении домашней страницы.
У тебя есть какие-нибудь идеи, почему?

Любая помощь была бы очень признательна! Спасибо!

Ответ №1:

Я бы предложил перенести проверку сети в MyContext.tsx и использовать прослушиватель, предоставляемый API

 const [showToast, setShowToast] = useState<boolean>(false);
const [toastMessage, setToastMessage] = useState("");


Network.addListener('networkStatusChange', status => {
  console.log('Network status changed', status);
  status.connected ?  setShowToast(true) :   setShowToast(false)
});
 

таким образом, вы можете задать соответствующее состояние независимо от конкретной страницы, которая в данном примере является домашней страницей.

Комментарии:

1. спасибо, я меняю его прямо сейчас. О чем <IonToast> ? Должен ли я размещать его на каждой странице своего приложения?