41 votes

Flow (React Native) me donne des erreurs pour utiliser 'this.state'

Flow me donne l'erreur suivante chaque fois que j'essaie d'utiliser this.state dans mon code:

Littéral d'objet: Ce type est incompatible avec undefined. Avez-vous oublié de déclarer le paramètre de type State de l'identifiant Component ?:

Voici le code incriminé (bien que cela se produise ailleurs également):

 class ExpandingCell extends Component {
    constructor(props) {
    super(props);
    this.state = {
        isExpanded: false
    };
}
 

Toute aide serait très appréciée =)

60voto

edvinerikson Points 641

Vous devez définir un type pour la propriété state afin de l'utiliser.

 class ComponentA extends Component {
    state: {
        isExpanded: Boolean
    };
    constructor(props) {
        super(props);
        this.state = {
            isExpanded: false
        };
    }
}
 

28voto

Derek Soike Points 3634

Si vous êtes à l'aide de flux et que vous voulez définir this.state dans votre composant constructor:


1. Créer un type pour this.state

type State = { width: number, height: number }

2. Initialiser votre composant avec qui type

export default class MyComponent extends Component<Props, State> { ... }

3. Maintenant, vous pouvez configurer this.state sans flux erreurs

  constructor(props: any) {
    super(props)
    this.state = { width: 0, height: 0 }
  }

Voici un exemple plus complet que les mises à jour this.state avec la largeur et la hauteur du composant lorsqu' onLayout est appelé.

// @flow

import React, {Component} from 'react'
import {View} from 'react-native'

type Props = {
  someNumber: number,
  someBool: boolean,
  someFxn: () => any,
}

type State = {
  width: number,
  height: number,
}

export default class MyComponent extends Component<Props, State> {

  constructor(props: any) {
    super(props)

    this.state = {
      width: 0,
      height: 0,
    }
  }

  render() {

    const onLayout = (event) => {
      const {x, y, width, height} = event.nativeEvent.layout
      this.setState({
        ...this.state,
        width: width,
        width: height,
      })
    }

    return (
      <View style={styles.container} onLayout={onLayout}>

        ...

      </View>
    )
  }
}

const styles = StyleSheet.create({
  container: {
    display: 'flex',
    flexDirection: 'column',
    justifyContent: 'center',
    alignItems: 'center',
  },
})

-23voto

lee Points 72

supprimer le /* @flow */ dans votre code flite top

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X