चेतावनी: एक अनमाउंट घटक पर एक प्रतिक्रिया स्थिति अद्यतन नहीं कर सकता। यह एक नो-ऑप है, लेकिन यह आपके एप्लिकेशन में मेमोरी लीक को इंगित करता है। ठीक करने के लिए, एक useEffect क्लीनअप फ़ंक्शन में सभी सदस्यता और अतुल्यकालिक कार्यों को रद्द करें।

मैंने सब कुछ ठीक करने की कोशिश की है लेकिन कुछ भी काम नहीं करता है। मैंने "useEffect" का भी उपयोग नहीं किया। यह तब होता है जब मैं खाते में लॉगिन करता हूं और उपयोगकर्ता को खोज पृष्ठ पर नेविगेट करता हूं।

लॉगिनस्क्रीन.जेएस

const validationSchema = Yup.object().shape({
  email: Yup.string()
    .label("Email")
    .email("Enter a valid email")
    .required("Please enter a registered email"),
  password: Yup.string()
    .label("Password")
    .required()
    .min(6, "Password must have at least 6 characters "),
});
const { width, height } = Dimensions.get("window");
class loginScreen extends React.Component {
  state = {
    passwordVisibility: true,
    rightIcon: "ios-eye",
  };

  goToSignup = () => this.props.navigation.navigate("Signup");

  handlePasswordVisibility = () => {
    this.setState((prevState) => ({
      rightIcon: prevState.rightIcon === "ios-eye" ? "ios-eye-off" : "ios-eye",
      passwordVisibility: !prevState.passwordVisibility,
    }));
  };
  handleOnLogin = async (values, actions) => {
    const { email, password } = values;
    try {
      const response = await this.props.firebase.loginWithEmail(
        email,
        password
      );

      if (response.user) {
        this.props.navigation.navigate("App");
      }
    } catch (error) {
      alert("Seems like there is no account like that. Try something else.");
    } finally {
      actions.setSubmitting(false);
    }
  };

सर्चस्क्रीन.जेएस

class searchScreen extends Component {
  apiurl = "";
  _isMounted = false;
  constructor(props) {
    super(props);
    this.state = {
      searchText: "",
      results: [],
      isLoading: true,
    };
  }

  showMovie = async (imdbID) => {
    await axios(this.apiurl + "&i=" + imdbID).then(({ data }) => {
      let result = data;
      this.props.navigation.navigate("Movie", {
        selected: result,
        movieID: imdbID,
      });
    });
  };
  componentDidMount() {
    this._isMounted = true;
    this.initial();
  }
  componentWillUnmount() {
    this._isMounted = false;
  }

  initial = async () => {
    const user = await this.props.firebase.getUser(user);

    try {
      await AsyncStorage.setItem("useruid", user.uid);
    } catch (error) {
      console.log(error);
    }
    const expoToken = await UserPermissions.registerForPushNotificationsAsync();
    if (expoToken) {
      this.props.firebase.setExpoToken(expoToken);
    }
    if (this._isMounted) {
      this.setState({ isLoading: false });
    }
  };
  search = async () => {
    Keyboard.dismiss();
    await axios(this.apiurl + "&s=" + this.state.searchText).then(
      ({ data }) => {
        let results = data.Search;
        if (this._isMounted) {
          this.setState((prevState) => {
            return { ...prevState, results: results };
          });
        }
      }
    );
  };
1
Kaepxer 17 पद 2020, 14:56

1 उत्तर

सबसे बढ़िया उत्तर

एक सफल लॉगिन के बाद, आप नेविगेट फ़ंक्शन को कॉल करते हैं। यह एक अलग घटक पर नेविगेट करता है, जिसका अर्थ है कि लॉगिन घटक अनमाउंट हो जाता है। हैंडललॉगिन फ़ंक्शन में अभी भी निष्पादित करने के लिए और अधिक तर्क हैं, हालांकि, आपके अंतिम कथन में, आप सबमिशन को गलत पर सेट कर रहे हैं। जब वह अंत में चलता है तो कोई घुड़सवार घटक नहीं होता है जिसका अर्थ है कि सेट करने के लिए कोई राज्य नहीं है।

नेविगेट कॉल से पहले और अलर्ट से पहले अपने सबमिशन को गलत स्थिति में बदलने से समस्या का समाधान हो जाएगा।

मैं अनुशंसा करता हूं कि यदि उपयोगकर्ता वास्तव में लॉग इन करता है तो इससे परेशान न हों, क्योंकि उपयोगकर्ता नेत्रहीन पूरी तरह से अलग स्क्रीन पर जाने वाला है, राज्य को बदलने से वास्तव में उनकी मदद नहीं होती है।

3
callmetwan 17 पद 2020, 15:30