Passage de variables dans un widget Stateful

Bonjour à tous,

Je suis en train de mettre en place un widget que j’ai externalisé. Je dois depuis ma vue principale faire passer une liste à ce widget mais je bloque un peu pour passer mes données du statefulWidget jusqu’à mon état. Le configurateur me demande de ne pas mettre de variable au niveau du createState

class DetailImageSliderWidget extends StatefulWidget {
  final List<String> posterPathList;
  const DetailImageSliderWidget({required this.posterPathList, Key? key})
      : super(key: key);

  @override
  State<DetailImageSliderWidget> createState() =>
      _DetailImageSliderWidgetState(posterPathList: posterPathList);
//Don't put any logic in createState.
}

class _DetailImageSliderWidgetState extends State<DetailImageSliderWidget> {
  final List<String> posterPathList;

Help !!

1 « J'aime »

Personnellement quand j’ai besoin de faire mon propre Widget je fais un type Widget :

Widget MyWidget({
  required BuildContext context,
}) {
  return Container(// Ton widget );
}

Si jamais tu veux personnaliser un widget et lui mettre une valeur par default dans ton app :

Widget CardCustom({
  required Widget child,
  Color? color,
  EdgeInsets? margin,
  EdgeInsets? padding,
}) {
  return Card(
    margin: EdgeInsets.zero,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(10.0),
    ),
    elevation: 1,
    color: (color != null) ? color : null,
    child: Padding(
      padding: (padding != null) ? padding : const EdgeInsets.all(14.0),
      child: child,
    ),
  );
}

Par exemple.

Maintenant si tu as besoin de logique dans ton widget, effectivement il faut que tu soit dans un StatefulWidget
Dans ton cas je ferais tout simplement comme ceci :

class DetailImageSliderWidget extends StatefulWidget {
  final List<String> posterPathList;
  const DetailImageSliderWidget({required this.posterPathList, Key? key}) : super(key: key);

  @override
  State<DetailImageSliderWidget> createState() => _DetailImageSliderWidgetState();
}

class _DetailImageSliderWidgetState extends State<DetailImageSliderWidget> {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: widget.posterPathList.length,
      itemBuilder: (context, index) {
        return ListTile(
          title: Text(widget.posterPathList[index]),
        );
      },
    );
  }
}

Et si jamais tu as besoin de manipuler ton posterPathList, il faut que tu mets en place un initState.

@Tazooou j’ai eu le même problème.

class MaClasse extends StatefulWidget {
  //declaration d'objet
final List<String> _maListe;

  const MaClasse({Key? key, required maListe})
      : _maListe = maListe,
        super(key: key);

  @override
  State<MaClasse> createState() => _MaClasseState();
}

class _MaClasseState extends State<MaClasse> {
  //Pour l'utiliser dans une variable locale listIci par exemple :
var listIci=widget._malist;

J’ai mis un « widget. » devant pour y faire appel.
Je débute également donc c’est peut pas ca. Au cas où tu peux éssayer :wink:

Oui c’est ça @Xababa_Dalabama mais dans un initState pour initialiser ta var à la construction de ton State :slight_smile:
Si tu veux savoir pourquoi, je te laisse te renseigner dans la doc

Du coup ça te donne ça :

class DetailImageSliderWidget extends StatefulWidget {
  final List<String> posterPathList;
  const DetailImageSliderWidget({required this.posterPathList, Key? key}) : super(key: key);

  @override
  State<DetailImageSliderWidget> createState() => _DetailImageSliderWidgetState();
}

class _DetailImageSliderWidgetState extends State<DetailImageSliderWidget> {
  late List<String> posterPathListState;

  @override
  void initState() {
    // TODO: implement initState
    posterPathListState = widget.posterPathList;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: widget.posterPathList.length,
      itemBuilder: (context, index) {
        return ListTile(
          title: Text(posterPathListState[index]),
        );
      },
    );
  }
}
1 « J'aime »

Hello @AntoLhn,

Merci pour l’aide ca marche niquel !!

Mon caroussel d’image fonctionne à merveille :wink:

1 « J'aime »

Nickel ! Tu peux mettre le message en solution alors, ça pourra aider d’autre personnes comme ça :slight_smile: