【问题标题】:How can I reload a FutureBuilder widget after using Navigator.pop() in another one在另一个中使用 Navigator.pop() 后如何重新加载 FutureBuilder 小部件
【发布时间】:2022-09-30 02:52:22
【问题描述】:

所以基本上我有一个简单的小部件,它使用 FutureBuilder 构建我的小部件,其中包含可以在数据库中修改的数据列表,这里是代码:

ListView(
      scrollDirection: Axis.vertical,
      shrinkWrap: true,
      children: <Widget>[
        Flexible(
            child: FutureBuilder<List<Incoming>>(
          future: UserApiService.getAllHelp(),
          builder: (context, snapshot) {
            if (snapshot.hasError) {
              return Text(\'Error ${snapshot.error}\');
            }
            if (snapshot.hasData) {
              streamController.sink.add(snapshot.data!.length);
              return gridView(snapshot);
            }
            return circularPogress();
          },
        )),
      ],
    );

gridView 方法只是一个进行设计的 Widget(代码如下)

gridView(AsyncSnapshot<List<Incoming>> snapshot) {
    return Padding(
      padding: const EdgeInsets.all(5.0),
      child: Column(
        children: snapshot.data!.map(
          (incoming) {
            return GestureDetector(
              child: GridTile(
                child: cardUI(incoming),
              ),
              onTap: () {
                goToProceed(context, incoming);
              },
            );
          },
        ).toList(),
      ),
    );
  }

goToProceed 是另一种打开具有 2 个按钮的对话框的方法(代码如下)

goToProceed(BuildContext context, Incoming incoming){
    Navigator.push(
      context,
      MaterialPageRoute(
        fullscreenDialog: true,
        builder: (BuildContext context) =>
          HelperProceedIncom(incoming: incoming)
      )
    );
  }

在包含 2 个按钮的第二个小部件中,其中一个按钮正在更新列表一项的数据,第二个按钮只是使用 Navigator.pop() 关闭对话框。 关闭对话框时,我希望刷新主小部件(包含 FutureBuilder 的小部件)并显示新数据。

我该怎么做,提前谢谢你。

    标签: flutter dart widget navigator


    【解决方案1】:

    单击按钮即可设置状态,未来的构建器将刷新。如果您想在添加路线导航的同一类中刷新它,请使用then

    goToProceed(BuildContext context, Incoming incoming){
        Navigator.push(
          context,
          MaterialPageRoute(
            fullscreenDialog: true,
            builder: (BuildContext context) =>
              HelperProceedIncom(incoming: incoming)
          )
        ).then(val){
       setState((){});
       };
      }
    

    【讨论】:

    • 我是否将 setState 留空? @Kaushik Chandru
    • 是的,一个固定的状态将重建未来的建设者
    • 它不刷新。
    【解决方案2】:

    没有这段代码,我找不到任何解决方案。

    ElevatedButton(
              onPressed: () {
                  Navigator.pushReplacement(
                         context,
                         MaterialPageRoute(
                              builder: (context) =>
                                 SameScreen()));
                        },
               child: Text('Refresh'),
                ),
    

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 2018-12-15
      • 2020-08-27
      • 2023-04-04
      • 2020-07-11
      • 2019-02-19
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      相关资源
      最近更新 更多