Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

toast.show is not a function #127

Open
jocoders opened this issue Mar 22, 2022 · 12 comments
Open

toast.show is not a function #127

jocoders opened this issue Mar 22, 2022 · 12 comments
Labels
bug Something isn't working

Comments

@jocoders
Copy link

jocoders commented Mar 22, 2022

Guys thank you so much for the great library! Please can you help me with this error))

Current behaviour

The app crashes with error:

toast.show is not a function. (In 'toast.show('Hello World')', 'toast.show' is undefined

After the app launching get render error.

Expected behaviour

Expect app is not crashing and notification is appearing.

Code sample

I use the same code from your example:

import { useToast } from "react-native-toast-notifications";

const Component = () => {
  const toast = useToast();

  useEffect(() => {
    toast.show("Hello World");
  }, []);
};

and before it I wrapped my app.tsx to provider:

  <ToastProvider>
     <RestOfYourApp />
  <ToastProvider/>

Screenshots (if applicable)

What have you tried

Your Environment

software version
ios or android both platform
react-native 0.64
react-native-toast-notifications 3.2.3
node 14.18.3
yarn 1.22.17

Simulator Screen Shot - iPhone 8 - 2022-03-22 at 08 46 57

@jocoders jocoders added the bug Something isn't working label Mar 22, 2022
@WyattSmithTritium
Copy link

Also having this problem. I have a toast instance for each screen and it works everywhere except my splash screen.

@ailouranada
Copy link

ailouranada commented Mar 25, 2022

Guys thank you so much for the great library! Please can you help me with this error))

Current behaviour

The app crashes with error:

toast.show is not a function. (In 'toast.show('Hello World')', 'toast.show' is undefined

After the app launching get render error.

Expected behaviour

Expect app is not crashing and notification is appearing.

Code sample

I use the same code from your example:

import { useToast } from "react-native-toast-notifications";

const Component = () => {
  const toast = useToast();

  useEffect(() => {
    toast.show("Hello World");
  }, []);
};

and before it I wrapped my app.tsx to provider:

  <ToastProvider>
     <RestOfYourApp />
  <ToastProvider/>

Screenshots (if applicable)

What have you tried

Your Environment

software version
ios or android both platform
react-native 0.64
react-native-toast-notifications 3.2.3
node 14.18.3
yarn 1.22.17
Simulator Screen Shot - iPhone 8 - 2022-03-22 at 08 46 57

I had the same issue. This solved the problem. Wrap your components inside App.js with ToastProvider

@nikki-cat
Copy link

I have the same issue

@ailouranada
Copy link

I had the same issue. This solved the problem. Wrap your components inside App.js with ToastProvider

@omeranar1
Copy link

omeranar1 commented May 3, 2022

I have the same issue

          <StatusBar backgroundColor={'#1976d2'} />
          <Provider store={store}>
          <ToastProvider>
            <NavigationContainer>
              <AppStack />
            </NavigationContainer>
            </ToastProvider>
          </Provider>
      <ToastProvider>
        <StatusBar backgroundColor={'#1976d2'} />
        <Provider store={store}>
          <NavigationContainer>
            <AppStack />
          </NavigationContainer>
        </Provider>
      </ToastProvider>

dont use;

   useEffect(() => {
     toast.show("Hello World")
   }, [])

use;

      <Button
        title='Show toast'
        onPress={showToast}
      />

@brunomacedo
Copy link

I also had the same issue. Move the StatusBar to outside the ToastProvider and it works well.

  • Before
<ToastProvider>
    <HomeScreen />
    <StatusBar style="auto" />
</ToastProvider>
  • Fixed
<>
    <ToastProvider>
        <HomeScreen />
    </ToastProvider>
    <StatusBar style="auto" />
</>

@itsramiel
Copy link

The issue is that on the first render the toast object is an empty object and only after a the useEffect is ran, the empty object is replaced with an object that contain the methods also as a state, so your component needs to rerender to get the new object which hold the methods. You can see from this code how it is initially an empty object at first and then it is populated. This from the source code

import React, { FC, useEffect, useRef, useState } from "react";
import ToastContext from "./context";
import Toast, { Props } from "../toast-container";

const ToastProvider: FC<Props> = ({ children, ...props }) => {
  const toastRef = useRef(null);
  const [refState, setRefState] = useState({});

  useEffect(() => {
    setRefState(toastRef.current as any);
  }, []);

  return (
    <ToastContext.Provider value={refState as any}>
      {children}
      <Toast ref={toastRef} {...props} />
    </ToastContext.Provider>
  );
};

export default ToastProvider;

I would have opened a pull request to address this but I have already opened a pull request to fix components under toast not being able to be pressed, but the author seems to be inactive

@rogerkerse
Copy link

It is not great, but I solved it by doing this in typescript

const toast = useToast()

useEffect(() => {
    toast.show?.('Hello World')
}, [toast])

@mehmetsalihyaldiz
Copy link

mehmetsalihyaldiz commented Aug 8, 2022

Before
<ToastProvider> <RestOfYourApp /> <ToastProvider/>

After
<ToastProvider> <RestOfYourApp /> </ToastProvider>

@ShivamJoker
Copy link

It is not great, but I solved it by doing this in typescript

const toast = useToast()

useEffect(() => {
    toast.show?.('Hello World')
}, [toast])

This seems to work but I would like this to be fixed

@notblessy
Copy link

Hey I have same issue, but I solved it by using React.useState() like this:

const toast = useToast()

const [message, setMessage] = useState(null)

useEffect(() => {
    if (message) {
      toast.show(message, {
        type: 'danger'
      })
      setMessage(null)
    }
  }, [toast]);

Now if I set message with string, it will show the toast.

I think this is not a perfect solution but since the author seems to be inactive, this solution works perfectly on me.

@tahola
Copy link

tahola commented Jan 31, 2024

I have the issue on some components, my solution is to put the toast in useEffect, that's not clean but it work...

  React.useEffect(() => {
    if (toast) {
      toast.show(message);
    }
  }, [toast]); 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests