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.
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.
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