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

Raf*_*ino 5 navigator setstate dart flutter

我想在 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());
      },);
  }
}
Run Code Online (Sandbox Code Playgroud)

我想在弹出后使用 setState 重新加载此 Stream,但不起作用。任何人都可以帮忙吗?

我需要重建那个StreamBuilder?还是只重新加载列表?

使用StreamBuilder,我需要执行setState,如果我重建了streamBuilder,它会起作用吗?

Feu*_*Feu 0

我想在该示例中您必须使用 aStreamController而不是 a 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());
      },);
  }
}
Run Code Online (Sandbox Code Playgroud)

但在您的用例中,您是否只有一家企业/公司,还是有很多?

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

如果您希望有一个对象列表,那么我StreamBuilder也不会使用 a 。我也会管理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()
              ],
            ),
        );
  }
}
Run Code Online (Sandbox Code Playgroud)

祝你好运!