假设我有这样的东西:

return FutureBuilder(
  future: _loadingDeals,
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    return RefreshIndicator(
      onRefresh: _handleRefresh,
        ...
    )
  }
 )

_handleRefresh方法中,我希望以编程方式触发FutureBuilder的重新运行.

有这样的事吗?

用例:

当用户取下refreshIndicator时,_handleRefresh只需让FutureBuilder自己重新运行.

Edit:

完整的代码段首尾相连,没有刷新部分.我已经改用了StreamBuilderrefreshIndicator部分如何适应所有这些?

class DealList extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _DealList();
}

class _DealList extends State<DealList> with AutomaticKeepAliveClientMixin {
  // prevents refreshing of tab when switch to
  // Why? https://stackoverflow.com/q/51224420/1757321
  bool get wantKeepAlive => true; 

  final RestDatasource api = new RestDatasource();
  String token;
  StreamController _dealsController;

  @override
  void initState() {
    super.initState();
    _dealsController = new StreamController();
    _loadingDeals();
  }

  _loadingDeals() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    this.token = prefs.getString('token');

    final res =
        this.api.checkInterests(this.token).then((interestResponse) async {
      _dealsController.add(interestResponse);
      return interestResponse;
    });
    return res;
  }

  _handleRefresh(data) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    final token = prefs.getString('token');
    await this.api.checkInterests(token).then((interestResponse) {
      _dealsController.add(interestResponse);
    });
    return null;
  }

  @override
  Widget build(BuildContext context) {
    super.build(context); // <-- this is with the wantKeepAlive thing
    return StreamBuilder(
      stream: _dealsController.stream,
      builder: (BuildContext context, AsyncSnapshot snapshot) {

        if (snapshot.hasError) {
          ...
        }

        if (snapshot.connectionState != ConnectionState.done) {
          return Center(
            child: CircularProgressIndicator(),
          );
        }

        if (!snapshot.hasData &&
            snapshot.connectionState == ConnectionState.done) {
          return Text('No deals');
        }

        if (snapshot.hasData) {
          return ListView.builder(
                physics: const AlwaysScrollableScrollPhysics(),
                itemCount: snapshot.data['deals'].length,
                itemBuilder: (context, index) {
                  final Map deal = snapshot.data['deals'][index];
                  return ListTile(
                      onTap: () {
                        Navigator.push(
                          context,
                          MaterialPageRoute(
                            builder: (context) => DealsDetailPage(
                                  dealDetail: deal,
                                ),
                          ),
                        );
                      },
                      title: Text(deal['name']),
                      subtitle: Text(deal['expires']),
                    );
                },
              ),
        }
      },
    );
  }
}

推荐答案

为什么不使用StreamBuilder和Stream来代替FutureBuilder呢?

像这样的...

class _YourWidgetState extends State<YourWidget> {
  StreamController<String> _refreshController;

  ...
  initState() {
    super...
    _refreshController = new StreamController<String>();
   _loadingDeals();
  }

  _loadingDeals() {
    _refreshController.add("");
  }

  _handleRefresh(data) {
    if (x) _refreshController.add("");
  }

  ...
  build(context) {
    ...
    return StreamBuilder(
      stream: _refreshController.stream,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        return RefreshIndicator(
          onRefresh: _handleRefresh(snapshot.data),
            ...
        )
      }
    );
  }
}

我使用StreamBuilder创建了一个带有Flutter 主要示例的Gist,check it out

Dart相关问答推荐

如何找到这个Currate函数的返回类型?

Dart 中的const关键字放置有什么不同?

在 Flutter 中以间隔自动获取 API 数据

在Flutter中重命名文件/图像

如何在 Dart 游戏中重复听按键?

触发从小部件到状态对象的函数

在小部件之间画一条线

Flutter 如何移动文件

Flitter中的谷歌 map 没有出现

如何在 Flutter 中为 PopupMenu 添加圆角边框?

如何在 Flutter 中匹配密码和确认密码?

如何正确管理 Flutter 应用中的全局 textScaleFactor?

如何左对齐 Flutter 中的 OutlineButton 图标

对该常量表达式的求值会抛出一个表达式

'dart:async' 的函数 `runZoned` 的用途

如何将 3 字节的 unicode 字符写为字符串文字

如何重新引发异常并保留堆栈跟踪?

Dart 中的异步可迭代映射

Dart 中的with关键字

如何在 Dart 中将日期/时间字符串转换为 DateTime 对象?