首页 文章

Pop使用Flutter和StreamBuilder刷新最后一个屏幕

提问于
浏览
2

我想在Navigator.pop时重新加载我的列表,但我不能这样做 .

我的代码:

class ConfigCNPJPage extends StatefulWidget {
  bool voltarTela;
  ConfigCNPJPage({Key key, this.voltarTela}) : super(key: key);

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

class ConfigCNPJPageState extends State<ConfigCNPJPage>
    with SingleTickerProviderStateMixin {
    ResultConfig BD;
    List<Map> list;
    List<Widget> listArray = [];

    Stream myStream;


  Future setupList() async {
    ConfigDatabase db = ConfigDatabase();
    var banco = await db.initDB();
    list = await banco.rawQuery('SELECT * FROM Empresa');
    return list;
  }



    @override
    void initState() {
      super.initState();
      myStream = setupList()?.asStream();
    }



  @override
  Widget build(BuildContext context) {
    return new StreamBuilder(
      stream: myStream,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        return snapshot.hasData?  new Scaffold(
          resizeToAvoidBottomPadding: false,
            appBar: new AppBar(
              title: new Text('Configurar Empresa'),
              actions: <Widget>[
                new IconButton(icon: const Icon(Icons.add), onPressed: () {
                  Navigator.pushNamed(context, "NovoCNPJ").then((value) {
                      setState(() {
                        myStream = setupList()?.asStream();
                      });
                  });
                })
              ],
            ),
            body: new Column(
              children: <Widget>[
                  criarLista()
              ],
            ),
        ):new Center(child: new RefreshProgressIndicator());
      },);
  }
}

我想在pop之后使用setState来实现这个Stream,但是不能正常工作 . 有人可以帮忙吗?

我需要重建StreamBuilder吗?或只重新加载列表?

使用StreamBuilder,我需要做setState,如果我重新编译了streamBuilder,它会工作吗?

1 回答

  • 0

    我猜你在这个例子中必须使用 StreamController 而不是 Stream .

    在您的示例中,请参阅 _streamController 次事件 .

    class ConfigCNPJPage extends StatefulWidget {
      bool voltarTela;
      ConfigCNPJPage({Key key, this.voltarTela}) : super(key: key);
    
      @override
      ConfigCNPJPageState createState() => new ConfigCNPJPageState();
    }
    
    class ConfigCNPJPageState extends State<ConfigCNPJPage>
        with SingleTickerProviderStateMixin {
        ResultConfig BD;
        List<Map> list;
        List<Widget> listArray = [];
    
        StreamController _streamController;
    
    
      Future setupList() async {
        ConfigDatabase db = ConfigDatabase();
        var banco = await db.initDB();
        list = await banco.rawQuery('SELECT * FROM Empresa');
        return list;
      }
    
    
    
        @override
        void initState() {
          super.initState();
          _streamController = new StreamController();
          setupList()?.then((o) => _streamController.add(o));
        }
    
    
    
      @override
      Widget build(BuildContext context) {
        return new StreamBuilder(
          stream: _streamController.stream,
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            return snapshot.hasData?  new Scaffold(
              resizeToAvoidBottomPadding: false,
                appBar: new AppBar(
                  title: new Text('Configurar Empresa'),
                  actions: <Widget>[
                    new IconButton(icon: const Icon(Icons.add), onPressed: () {
                      Navigator.pushNamed(context, "NovoCNPJ").then((value) {
                          setState(() {
                            _streamController.add(value);
                          });
                      });
                    })
                  ],
                ),
                body: new Column(
                  children: <Widget>[
                      criarLista()
                  ],
                ),
            ):new Center(child: new RefreshProgressIndicator());
          },);
      }
    }
    

    但在您的使用案例中,您是否只有一个empresa /公司或者您会有多个?

    如果你只有一个,而不是 Stream ,那么只管理一个 _empresa / _company 对象会更容易 .

    如果你希望有一个对象列表,那么我也不会使用 StreamBuilder . 我也会管理 List<Empresa> _empresas .

    class ConfigCNPJPage extends StatefulWidget {
      bool voltarTela;
      ConfigCNPJPage({Key key, this.voltarTela}) : super(key: key);
    
      @override
      ConfigCNPJPageState createState() => new ConfigCNPJPageState();
    }
    
    class ConfigCNPJPageState extends State<ConfigCNPJPage>
        with SingleTickerProviderStateMixin {
        ResultConfig BD;
        List<Map> list;
        List<Widget> listArray = [];
    
        List<Empresa> _empresas;
    
    
      Future setupList() async {
        ConfigDatabase db = ConfigDatabase();
        var banco = await db.initDB();
        list = await banco.rawQuery('SELECT * FROM Empresa');
        return list;
      }
    
      @override
      void initState() {
        super.initState();
    
        setupList()?.then((o) {
          if (_empresas == null) _empresas = new List();
    
          // if o is a list, perform a forEach on it
    
          _empresas.add(new Empresa(o))
        });
      }
    
      @override
      Widget build(BuildContext context) {
        // o melhor seria usar outra variavel pra controlar o loading,
        //   mas deve funcionar assim
        return _empresas == null
          ? new Center(child: new RefreshProgressIndicator())
          : new Scaffold(
              resizeToAvoidBottomPadding: false,
                appBar: new AppBar(
                  title: new Text('Configurar Empresa'),
                  actions: <Widget>[
                    new IconButton(icon: const Icon(Icons.add), onPressed: () {
                      Navigator.pushNamed(context, "NovoCNPJ").then((value) {
                          setState(() {
                            _empresas.add(new Empresa(value));
                          });
                      });
                    })
                  ],
                ),
                body: new Column(
                  children: <Widget>[
                      criarLista()
                  ],
                ),
            );
      }
    }
    

    祝好运!

相关问题