web-dev-qa-db-fra.com

Flutter setState à une autre classe?

J'ai une classe racine RootPage qui est un StatefulWidget qui est toujours en vue. Je voudrais changer le body dans RootPage qui est contrôlé par RootPage's currentPage Widget de différentes classes telles que ma classe FeedPage et toute autre classe que je fais?

Exemple de code

import 'package:flutter/material.Dart';

class RootPage extends StatefulWidget {
  @override
  _RootPageState createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
  FeedPage feedPage;

  Widget currentPage;

  @override
  void initState() {
    super.initState();
    feedPage = FeedPage();

    currentPage = feedPage;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      //Current page to be changed from other classes too?
      body: currentPage
    );
  }
}



class FeedPage extends StatefulWidget {
  @override
  _feedPageState createState() => new _feedPageState();
}
class _feedPageState extends State<FeedPage> {

  @override
  Widget build(BuildContext context) {
    return new FlatButton(
      onPressed: () {
        setState(() {
          //change the currentPage in RootPage so it switches FeedPage away and gets a new class that I'll make
        });
      },
      child: new Text('Go to a new page but keep root, just replace this feed part'),
    );
  }
}

Je suis sûr qu'il y a une réponse évidente, mais je n'arrive pas à comprendre comment le faire efficacement, il sera donc facile d'intégrer les futures classes et de garder ma racine toujours en vue.

14
Jayden

Vous pouvez utiliser les fonctions de rappel pour y parvenir. Veuillez vous référer au code ci-dessous.

import 'package:flutter/material.Dart';

class RootPage extends StatefulWidget {
  @override
  _RootPageState createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
  FeedPage feedPage;

  Widget currentPage;

  @override
  void initState() {
    super.initState();
    feedPage = FeedPage(this.callback);

    currentPage = feedPage;
  }

  void callback(Widget nextPage) {
    setState(() {
      this.currentPage = nextPage;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      //Current page to be changed from other classes too?
        body: currentPage
    );
  }
}



class FeedPage extends StatefulWidget {
  Function callback;

  FeedPage(this.callback);

  @override
  _feedPageState createState() => new _feedPageState();
}
class _feedPageState extends State<FeedPage> {

  @override
  Widget build(BuildContext context) {
    return new FlatButton(
      onPressed: () {
        this.widget.callback(new NextPage());
//        setState(() {
//          //change the currentPage in RootPage so it switches FeedPage away and gets a new class that I'll make
//        });
      },
      child: new Text('Go to a new page but keep root, just replace this feed part'),
    );
  }
}

Ceci est très similaire à cela problème et vous pouvez vous référer au 3ème point dans ma réponse.

10

Je sais que vous avez besoin d'une solution pour votre code spécifique, mais je vous recommande de jeter un œil sur le modèle BloC car c'est l'approche recommandée lorsque vous souhaitez passer des changements d'état d'un widget à un autre, en particulier plusieurs pages

l'idée est simple bien que l'implémentation soit "un peu" plus compliquée

0
Saed Nabil