react-native-toast-notifications icon indicating copy to clipboard operation
react-native-toast-notifications copied to clipboard

toast.show is not a function

Open jocoders opened this issue 2 years ago • 12 comments

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 avatar Mar 22 '22 06:03 jocoders

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

WyattSmithTritium avatar Mar 24 '22 18:03 WyattSmithTritium

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

ailouranada avatar Mar 25 '22 15:03 ailouranada

I have the same issue

nikki-cat avatar Apr 04 '22 14:04 nikki-cat

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

ailouranada avatar Apr 15 '22 10:04 ailouranada

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}
      />

omeranar1 avatar May 03 '22 19:05 omeranar1

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" />
</>

brunomacedo avatar Jun 03 '22 13:06 brunomacedo

  useEffect(() => {
    if (!toast) return null    
    toast.show('Hello World')
  }, [])

velialan avatar Jun 05 '22 18:06 velialan

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

itsramiel avatar Jun 07 '22 11:06 itsramiel

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

const toast = useToast()

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

rogerkerse avatar Jul 09 '22 07:07 rogerkerse

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

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

mehmetsalihyaldiz avatar Aug 08 '22 07:08 mehmetsalihyaldiz

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

ShivamJoker avatar Nov 18 '22 20:11 ShivamJoker