dart flutter setstate

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.