web-dev-qa-db-fra.com

Comment définir / mettre à jour l'état de StatefulWidget à partir d'un autre StatefulWidget dans Flutter?

  1. Par exemple, dans le code ci-dessous, le bouton plus fonctionne et peut mettre à jour le texte, mais pas le bouton moins.
  2. Mais si nous appuyons sur FloatingActionButton, l'état est rafraîchi.
  3. Le bouton moins modifie la valeur de la variable mais ne met pas à jour l'état du widget parent.

enter image description here

voici le code .....

import 'package:flutter/material.Dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

int number;

EdgeInsets globalMargin = const EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0);
TextStyle textStyle = const TextStyle(
  fontSize: 100.0,
  color: Colors.black,
);

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    number = number ?? 0;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Column(
        children: <Widget>[
          new Text(
            number.toString(),
            style: textStyle,
          ),
          new GridView.count(
            crossAxisCount: 2,
            shrinkWrap: true,
            scrollDirection: Axis.vertical,
            children: <Widget>[
              new InkResponse(
                child: new Container(
                    margin: globalMargin,
                    color: Colors.green,
                    child: new Center(
                      child: new Text(
                        "+",
                        style: textStyle,
                      ),
                    )),
                onTap: () {
                  setState(() {
                    number = number + 1;
                  });
                },
              ),
              new Sub(),
            ],
          ),
        ],
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          setState(() {});
        },
        child: new Icon(Icons.update),
      ),
    );
  }
}

class Sub extends StatefulWidget {
  @override
  _SubState createState() => new _SubState();
}

class _SubState extends State<Sub> {
  @override
  Widget build(BuildContext context) {
    return new InkResponse(
      child: new Container(
          margin: globalMargin,
          color: Colors.red,
          child: new Center(
            child: new Text(
              "-",
              style: textStyle,
            ),
          )),
      onTap: () {
        setState(() {
          number = number - 1;
        });
      },
    );
  }
}
37
AjayKumar

Bien que la plupart de ces réponses précédentes fonctionnent, je vous suggère d'explorer le fournisseur ou les architectures BloC, qui ont toutes deux été recommandées par Google.

En bref, ce dernier créera un flux qui rendra compte aux widgets de l'arborescence des widgets chaque fois qu'un changement d'état se produit et il met à jour toutes les vues pertinentes indépendamment de l'endroit où il est mis à jour.

Voici un bon aperçu que vous pouvez lire pour en savoir plus sur le sujet: https://bloclibrary.dev/#/

0
Jacobo Koenig