我正面临着一个问题,在我当前的项目重建future 的建设者每当数据被添加或更新.

在将数字添加到数字中后,应该重新构建future 的生成器以显示所有更新的数字.

我已经在OBX内部包装了Future Builder,但它没有重建,因为它里面不包含任何OBS变量…

那么如何刷新它..关于增加或删除号码

Widget build(BuildContext context) {
    final controller = Get.put(DataController());
    return Scaffold(
      body: Column(
        children: [
          Expanded(
            child:  Obx(
                ()=>FutureBuilder(
               future: controller.fetchData(),
                    builder: (context, snapshot) {
                      const loader = Center(child: CircularProgressIndicator());

                      if (snapshot.connectionState == ConnectionState.waiting)
                        return loader;

                      if (!snapshot.hasData ||
                          snapshot.data == null ||
                          snapshot.data!.isEmpty)
                        return Center(
                          child: Text('No data found'),
                        );

                      if (snapshot.hasError) {
                        return const Center(
                          child: Text('Error found'),
                        );
                      }

                      final allData = snapshot.data!;

                      return ListView.builder(
                          shrinkWrap: true,
                          itemCount: allData.length,
                          itemBuilder: (context, index) {
                            final data = allData[index];
                            return ListTile(
                              title: Text(data.toString()),
                            );
                          });
                    })
            ),
          ),
          SizedBox(
              height: 100,
              width: double.infinity,
              child: ElevatedButton(onPressed: (){
                final num=Random().nextInt(1000);
                numbers.add(num);
              },child: Text('Add Number'),))
        ],
      ),

    );
  }

数据控制器数据控制器


class DataController extends GetxController {
  RxBool isLoading = false.obs;
 

  Future<List<int>> fetchData() async {
    try {
      isLoading.value = true;
      final data = numbers;//numbers is a list[int] stored in different file
      return data;
    } catch (e) {
      print('Something wrong');
      return [];
    } finally {
      isLoading.value = false;
    }
  }
}

对于数据源 我刚刚在一个海珍珠文件中创建了一个int列表

List<int> numbers=[1,2,3];

推荐答案

根据我的说法,你有3个选项来解决你的问题,但它取决于你的代码,这对你来说是OK的.

  1. 使用有状态而不是无状态,这样您就可以在向列表添加数字时通过setState重新构建整个UI

  2. 而不是将来构建器使用ListView. builder,它使用控件RxList编号来显示数据,以及在向列表中添加编号时.listview将被重新构建,如果它被封装为Obx.

  3. 在你的控制器中使用伪变量,它在添加数字时保持变化,并在你的future 生成器中使用这个虚拟变量作为键来重建它.这里,future 生成器必须用OBX包装.

这是它的代码...

将RxBool refreshData添加到控制器

class DataController extends GetxController {
  RxBool isLoading = false.obs;
RxBool refreshData=true.obs;
// ADD ABOVE LINE IN YOUR CODE
 

  Future<List<int>> fetchData() async {
    try {
      isLoading.value = true;
      final data = numbers;//numbers is a list[int] stored in different file
      return data;
    } catch (e) {
      print('Something wrong');
      return [];
    } finally {
      isLoading.value = false;
    }
  }
}

Exp和ed(
            child:  Obx(
                ()=>FutureBuilder(
key:Key(controller.refreshData.value.toString(),
//ADD ABOVE LINE IN YOUR CODE
               future: controller.fetchData(),
                    builder: (context, snapshot) {

和 finally toggle refreshData value when adding number

SizedBox(
            height: 100,
            width: double.infinity,
            child: ElevatedButton(
              onPressed: () {
                final num = R和om().nextInt(1000);
                numbers.add(num);
 controller.refreshData.toggle();
//ADD ABOVE LINE IN YOUR CODE

              },
              child: const Text('Add Number'),
            ))

Flutter相关问答推荐

壁炉有序在Flutter

Dexing时出错.将Flutter 升级到3.19.0后

将目标平台设置为Flutter 构建

在Flutter 中创建自定义Snackbar类

出现异常.RangeError(RangeError(index):无效值:有效值范围为空:0).分度误差

就像Flutter 中的头文件一样?

脚本具有不受支持的MIME类型(';Text/html';).(messaging/failed-service-worker-registration)

为什么用户界面不会在Flight中的复选框中更改?

如何将小部件代码移动到另一个文件以获得更好的可读性

以编程方式在 flutter 中安装 apk 时解析错误

hooks_riverpod 有用途吗

Flutter:如何在现有布局之上显示圆角布局?

在允许屏幕 Select 和点击的同时保持通用对话框显示

Flutter Bloc 使用 Cubit 监听流和emits 状态

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

type '_InternalLinkedHashMap' 不是使用 http 包的'String' 类型的子类型

http响应在Flutter 中返回307

是否可以在 Flutter 中使用 ToggleButtons 在页面 PageView 之间切换?

使用 hydrad_bloc 的预览包

如何在Flutter 中专注于列表视图中最新添加的项目