我有一个定制的Flutter 小部件,它接收一个Future作为它的构造函数的参数,里面有FutureBuilder个.

我想增加在连接错误的情况下重新运行这个future 的能力,但问题是第一次使用后,future 是"用尽"的.所以我需要一些方法来创建一个future 的副本,作为一个参数在用户每次按下重新加载按钮时使用FutureBuilder内的副本.

import 'package:flutter/material.dart';

class CustomFutureBuilder<T> extends StatefulWidget {
  final Future<T> future;

  const CustomFutureBuilder({super.key, required this.future});

  @override
  State<CustomFutureBuilder<T>> createState() => _CustomFutureBuilderState<T>();
}

class _CustomFutureBuilderState<T> extends State<CustomFutureBuilder<T>> {
  late Future<T> _future;

  @override
  void initState() {
    // I need to use initState to initialize _future for the first usage of this widget
    _future = widget.future; // ← here I want to create a future clone and use it instead of original
    super.initState();
  }

  @override
  void didUpdateWidget(covariant CommonFutureBuilder<T> oldWidget) {
    _future = widget.future; // ← and here too
    super.didUpdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _future,
      builder: (context, snapshot) {
        if (snapshot.connectionState != ConnectionState.done) {
          return const LinearProgressIndicator();
        }
        if (snapshot.hasError) {
          debugPrint('Loading error: ${snapshot.error}');
          return Column(
            children: [
              const Text(
                  'Loading error is occurred. Check the internet connection or try again later.'),
              OutlinedButton(
                onPressed: () {
                  setState(() {
                    // ← and maybe here too, I am not sure
                  });
                },
                child: const Text('Reload'),
              ),
            ],
          );
        }

        final data = snapshot.data as T;
        return …
      },
    );
  }
}

推荐答案

所以我需要一些方法来创造一个future 的副本

你不能.解决这个问题的一种方法是,不是注射Future<T>,而是注射一家生产Future<T>的工厂.

因此,不是将_future传递到构造函数中,而是传递Function(Future<T>) futureFactory.

在您的InitState中,您需要调用它一次:

_future = futureFactory();

然后,当有人想要跑future 的again米时,你也会做同样的事情:

_future = futureFactory();

你不能重演future ,但如果你有办法创造那些future ,你就可以走了.

Flutter相关问答推荐

ShaderMask上的文本渐变问题

在Flutter 动中绘制ECG图

在Flutter 中将参数从一个类传递到另一个类

Flutter 翼future 建造者不断开火和重建.它在每次重建时都会生成一个新的随机数--我如何防止这种情况?

查询满足AND条件的文档的FiRestore

如何在Flutter 中共享选定文本

#Flutter/Riverpod - 使用 AsyncNotifier 时是否可以仅调用错误?

Riverpod中stateNotiferProvider和notifierProvider的区别

Flutter ImagePicker - 在 onPressed 中异步获取图像显示 lint 警告

Flutter - 我需要显示文本,但应用程序不需要

Flutter - 展开图标无法正常工作

当我使用 Confetti Widget 时,Flutter Android 和 IOS 应用程序崩溃

具有 BLOC 和存储库模式的 Flutter Workmanager

如何对齐卡片小部件中的图标按钮?

如何将 void 函数放入单独的 dart 文件的单独页面中

在 Flutter 中将提取的 Listview.builder 与两个列表一起使用

使用 hydrad_bloc 的预览包

如何使用我拥有的 .jks 文件签署我的应用程序

Flutter AAPT:错误:找不到资源android:attr / lStar

单击列表视图导航到 Flutter 中的另一个页面