dart - Flutter setState a otra clase?
(2)
Tengo una clase raíz
RootPage
que es un
StatefulWidget
que siempre está a la vista.
Me gustaría cambiar el
body
en
RootPage
que está controlado por
RootPage''s currentPage Widget
de diferentes clases, como mi clase
FeedPage
y cualquier otra clase que haga.
Código de ejemplo
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''),
);
}
}
Estoy seguro de que hay una respuesta obvia pero parece que no puedo encontrar la manera de hacerlo de manera eficiente, por lo que será fácil integrar las clases futuras y mantener mi Root siempre a la vista.
Puede utilizar las funciones de devolución de llamada para lograr esto. Por favor, consulte el siguiente código.
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''),
);
}
}
Esto es muy similar a este problem y podría referirse al tercer punto en mi respuesta.
Sé que necesita una solución para su código específico, pero le recomiendo que revise el patrón BloC, ya que es el método recomendado para pasar los cambios de estado de un widget a otro, especialmente a varias páginas.
La idea es simple, aunque la implementación es un poco más complicada.