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

"Animated: useNativeDriver was not specified" warning since React Native 0.62 #339

Open
RadomirKus opened this issue Mar 29, 2020 · 19 comments · Fixed by chakrahq/react-native-action-button#2 · May be fixed by #340 or #361
Open

Comments

@RadomirKus
Copy link

Following warning keeps appearing whenever I click on any button or item:

Animated: useNativeDriver was not specified. This is a required option and must be explicitly set to true or false

react-native: 0.62

@prabhu43 prabhu43 linked a pull request Apr 19, 2020 that will close this issue
@blindibrasil
Copy link

I think the solution to the problem will be to implement the following change to the ActionButton.js file;

 //////////////////////
  // Animation Methods
  //////////////////////

  animateButton(animate = true) {
    if (this.state.active) return this.reset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(1);
    }

    this.setState({ active: true, resetToken: this.state.resetToken });
  }

  reset(animate = true) {
    if (this.props.onReset) this.props.onReset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(0);
    }

    setTimeout(() => {
      if (this.mounted) {
        this.setState({ active: false, resetToken: this.state.resetToken });
      }
    }, 250);
  }

@sunkakar
Copy link

I have the same issue!

1 similar comment
@IgorThierry
Copy link

I have the same issue!

@ytr0
Copy link

ytr0 commented Jun 29, 2020

I think the solution to the problem will be to implement the following change to the ActionButton.js file;

 //////////////////////
  // Animation Methods
  //////////////////////

  animateButton(animate = true) {
    if (this.state.active) return this.reset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(1);
    }

    this.setState({ active: true, resetToken: this.state.resetToken });
  }

  reset(animate = true) {
    if (this.props.onReset) this.props.onReset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(0);
    }

    setTimeout(() => {
      if (this.mounted) {
        this.setState({ active: false, resetToken: this.state.resetToken });
      }
    }, 250);
  }

This works.

@Sharvin26
Copy link

I think the solution to the problem will be to implement the following change to the ActionButton.js file;

 //////////////////////
  // Animation Methods
  //////////////////////

  animateButton(animate = true) {
    if (this.state.active) return this.reset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(1);
    }

    this.setState({ active: true, resetToken: this.state.resetToken });
  }

  reset(animate = true) {
    if (this.props.onReset) this.props.onReset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(0);
    }

    setTimeout(() => {
      if (this.mounted) {
        this.setState({ active: false, resetToken: this.state.resetToken });
      }
    }, 250);
  }

I am also facing the same issue. Manual change works but this warning will always occur every time when the application is rebuilt ( i.e. node_modules are installed again ). Same issue will occur when publishing the app.

Is there any way we can suppress the warning till the author fixes this issue?

@blindibrasil
Copy link

I forwarded a message to the author requesting the error correction merge so that this error no longer appears. Now it's time to wait, as they take too long to make changes.
I believe that you could fork and send your correction to your app because it would be easier and faster, then when you launch the official correction you change.

@W8jonas
Copy link

W8jonas commented Jul 22, 2020

I think the solution to the problem will be to implement the following change to the ActionButton.js file;

 //////////////////////
  // Animation Methods
  //////////////////////

  animateButton(animate = true) {
    if (this.state.active) return this.reset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(1);
    }

    this.setState({ active: true, resetToken: this.state.resetToken });
  }

  reset(animate = true) {
    if (this.props.onReset) this.props.onReset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(0);
    }

    setTimeout(() => {
      if (this.mounted) {
        this.setState({ active: false, resetToken: this.state.resetToken });
      }
    }, 250);
  }

It's working fine !! But the author should consider implementing these changes in the new version.

@qiqo
Copy link

qiqo commented Jul 26, 2020

there's a pull request to fix this since April, I hope the author is all okay and could merge it for the fix.

@mannyhappenings
Copy link

Until the PRs get merged, monkey patching the class works,

Hope this helps to some people annoyed by that warning

import RNActionButton from 'react-native-action-button'
import { Animated } from 'react-native'

RNActionButton.prototype.animateButton = function(animate = true) {
    if (this.state.active) return this.reset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(1);
    }

    this.setState({ active: true, resetToken: this.state.resetToken });
}

RNActionButton.prototype.reset = function (animate = true) {
    if (this.props.onReset) this.props.onReset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(0);
    }

    setTimeout(() => {
      if (this.mounted) {
        this.setState({ active: false, resetToken: this.state.resetToken });
      }
    }, 250);
}

@Mazinkam
Copy link

Mazinkam commented Oct 1, 2020

How is this "monkey patch" used?

@ChronSyn
Copy link

How is this "monkey patch" used?

You paste the code at the top of the file for the component where you're using the action button

@fohletex fohletex linked a pull request Nov 11, 2020 that will close this issue
@manishsharma004
Copy link

How is this "monkey patch" used?

As @ChronSyn mentioned, you just paste the patch in any file. But since, it sets the prototype for a class, it's better to put it in an separate file as module an load it in some top level component like App so that it gets loaded only once(not that it makes much difference, but it feels better this way to load it). You don't need to put this patch in every file. Also do add a TODO comment to remove this patch once the PRs are merged and you update to the fixed version.

@ConstantTime
Copy link

I am trying to use this in Typescript but the monkey patch doesn't seem to be working. Any fix that can help in typescript? @mannyhappenings @manishsharma004 @ChronSyn

Errors being:

  1. Property 'animateButton' does not exist on type 'ActionButton'.
  2. Property 'reset' does not exist on type 'ActionButton'
  3. Property 'mounted' does not exist on type 'ActionButton', etc.

@dcjones1
Copy link

dcjones1 commented Mar 2, 2021

@ConstantTime Here are some quick and dirty typings:


interface ExtendedButton extends ActionButton {
  anim: Animated.Value;
  animateButton: Function;
  state: {
    active: boolean;
    resetToken: any;
  };
  reset: Function;
  mounted: boolean;
  props: ActionButtonProperties & {onReset: Function};
}
(RNActionButton.prototype as ExtendedButton).animateButton = function (animate = true) {
  if (this.state.active) return this.reset();
  if (animate) {
    Animated.spring(this.anim, {toValue: 1, useNativeDriver: false}).start();
  } else {
    this.anim.setValue(1);
  }
  this.setState({active: true, resetToken: this.state.resetToken});
};
(RNActionButton.prototype as ExtendedButton).reset = function (animate = true) {
  if (this.props.onReset) this.props.onReset();
  if (animate) {
    Animated.spring(this.anim, {toValue: 0, useNativeDriver: false}).start();
  } else {
    this.anim.setValue(0);
  }
  setTimeout(() => {
    if (this.mounted) {
      this.setState({active: false, resetToken: this.state.resetToken});
    }
  }, 250);
};

@phatmann
Copy link

The workaround: disable the warning:

useEffect(() => {
    LogBox.ignoreLogs(['Animated: `useNativeDriver`']);
}, [])

@GustavoContreiras-Feegow
Copy link

GustavoContreiras-Feegow commented Oct 15, 2021

  1. Run yarn add -D replace-in-files-cli
  2. On package.json, add replacement scripts and postinstall script:
{
  ...
  "scripts": {
    "replace:actionbutton": "yarn replace:actionbutton:stepone && yarn replace:actionbutton:steptwo && yarn replace:actionbutton:stepone && yarn replace:actionbutton:steptwo",
    "replace:actionbutton:stepone": "yarn replace-in-files --string='Animated.spring(this.anim, { toValue: 1 }' --replacement='Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }' node_modules/react-native-action-button/ActionButton.js",
    "replace:actionbutton:steptwo": "yarn replace-in-files --string='Animated.spring(this.anim, { toValue: 0 }' --replacement='Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }' node_modules/react-native-action-button/ActionButton.js",
    "postinstall": "yarn replace:actionbutton"
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    "replace-in-files-cli": "^1.0.0"
  }
}

Tip: Do this for any fix in any package you need to fix inside node_modules folder

@phatmann
Copy link

@GustavoContreiras-Feegow Thanks for the info. Any reason you are not using patch-package?

Taewoong1378 added a commit to Ablestor/react-native-action-button that referenced this issue Dec 20, 2021
@aglitoiu
Copy link

aglitoiu commented Apr 7, 2022

https://www.npmjs.com/package/react-native-action-button-warnings-fixed

Feel free to try it and create issues there, maybe we will be able to keep it maintained by community, in absence of creator

@DxrkMxn
Copy link

DxrkMxn commented Oct 3, 2022

I think the solution to the problem will be to implement the following change to the ActionButton.js file;

 //////////////////////
  // Animation Methods
  //////////////////////

  animateButton(animate = true) {
    if (this.state.active) return this.reset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 1, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(1);
    }

    this.setState({ active: true, resetToken: this.state.resetToken });
  }

  reset(animate = true) {
    if (this.props.onReset) this.props.onReset();

    if (animate) {
      Animated.spring(this.anim, { toValue: 0, useNativeDriver: false }).start();
    } else {
      this.anim.setValue(0);
    }

    setTimeout(() => {
      if (this.mounted) {
        this.setState({ active: false, resetToken: this.state.resetToken });
      }
    }, 250);
  }

I create a new component:

import ActionButton from 'react-native-circular-action-menu';
import { Animated } from 'react-native';
/**

  • CustomActionButton implementa el uso del componente ActionButton inyectando funciones de correción de errores
    */
    export default class CustomActionButton extends ActionButton {
    animateButton() {
    if (this.state.active) {
    this.reset();
    return;
    }

    Animated.spring(this.state.anim, {
    toValue: 1,
    useNativeDriver: false,
    duration: 250,
    }).start();

    this.setState({ active: true });
    }

reset() {
Animated.spring(this.state.anim, {
toValue: 0,
useNativeDriver: false,
duration: 250,
}).start();

setTimeout(() => {
  this.setState({ active: false });
}, 250);

}
}

this work to me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment