嗨,为什么我的列表项在flutter的futurebuilder中变为空?

njthzxwz  于 2022-11-17  发布在  Flutter
关注(0)|答案(2)|浏览(176)

你好,在我Flutter应用程序中有FutureBuilder返回listview,我的列表listview创建了一些按钮用于更新hive表。当我第一次单击其中一个按钮时,一切都运行顺利,但当我再次单击同一个按钮时,我的hive键变为空,程序显示此错误:“type 'Null'不是type 'int'的子类型“我在代码中到处都写了print,但我仍然不明白为什么键从第二次开始就变成null。我该如何更正这个问题?请帮助我。my Futurebuilder body is:

FutureBuilder<List>(
                            future: controller.showTaskList(),
                            builder: (context, snapshot) {
                              switch (snapshot.connectionState) {
                                case ConnectionState.waiting:
                                  return SizedBox(
                                    height: Get.height,
                                    child: const Center(
                                      child: CircularProgressIndicator(),
                                    ),
                                  );
                                default:
                                  if (snapshot.hasError) {
                                    return Text('Error: ${snapshot.error}');
                                  } else {
                                    List data = snapshot.data ?? [];

                                    return ListView.separated(
                                      scrollDirection: Axis.vertical,
                                      physics:
                                      const BouncingScrollPhysics(),
                                      shrinkWrap: true,
                                      itemCount: data.length,
                                      itemBuilder: (context, index) {
                                        // controller.taskIconCheckList
                                        //     .clear();

                                        for (int i = 0;
                                        i < data.length;
                                        i++) {
                                          if (data[i].status == true) {
                                            controller.taskIconCheckList
                                                .add(true.obs);
                                          } else {
                                            controller.taskIconCheckList
                                                .add(false.obs);
                                          }
                                        }
                                        return ListTile(
                                          leading: Obx(
                                                () => PageTransitionSwitcher(
                                              transitionBuilder: (
                                                  child,
                                                  primaryAnimation,
                                                  secondaryAnimation,
                                                  ) {
                                                return SharedAxisTransition(
                                                  animation:
                                                  primaryAnimation,
                                                  secondaryAnimation:
                                                  secondaryAnimation,
                                                  transitionType:
                                                  SharedAxisTransitionType
                                                      .horizontal,
                                                  fillColor:
                                                  Colors.transparent,
                                                  child: child,
                                                );
                                              },
                                              duration: const Duration(
                                                  milliseconds: 800),
                                              child: controller
                                                  .taskIconCheckList[
                                              index]
                                                  .value
                                                  ? SizedBox(
                                                child: IconButton(
                                                  icon: const Icon(
                                                    Icons
                                                        .check_circle_rounded,
                                                    color: Colors
                                                        .lightGreenAccent,
                                                  ),
                                                  onPressed: () {
                                                    controller
                                                        .functionTaskIconCheckList(
                                                      index,
                                                    );
                                                    print('طول دیتا');
                                                    print(data.length.toString());
                                                    print('مقدار ایندکس');
                                                    print(index.toString());
                                                    print('مقدار کلید');
                                                    print(data[index].key.toString());
                                                    print(data[index].taskText.toString());

                                                    controller
                                                        .updateStatusTask(
                                                        index,
                                                        data[index]
                                                            .key); // here when i first click // return key currectly, but after that show null and updatestatusetask not run and show error.
                                                  },
                                                ),
                                              )
                                                  : IconButton(
                                                onPressed: () {
                                                  controller
                                                      .functionTaskIconCheckList(
                                                    index,
                                                  );
                                                  print('طول دیتا');
                                                  print(data.length.toString());
                                                  print('مقدار ایندکس');
                                                  print(index.toString());
                                                  print('مقدار کلید');
                                                  print(data[index].key.toString());
                                                  print(data[index].taskText.toString());
                                                  controller
                                                      .updateStatusTask(
                                                      index,
                                                      data[index]
                                                          .key);  // here when i first click // return key currectly, but after that show null and updatestatusetask not run and show error. 
                                                },
                                                icon: const Icon(
                                                  Icons
                                                      .radio_button_unchecked_outlined,
                                                  color: Colors.red,
                                                ),
                                              ),
                                            ),
                                          ),
                                          title: Text(data[index].taskText,
                                              style: normalTextForCategory),
                                          subtitle: Text(
                                            data[index]
                                                .date
                                                .toString()
                                                .substring(0, 10),
                                            textDirection:
                                            TextDirection.ltr,
                                            textAlign: TextAlign.right,
                                            style: normalTextForSubtitle,
                                          ),
                                          trailing: Row(
                                            mainAxisSize: MainAxisSize.min,
                                            children: [
                                              IconButton(
                                                onPressed: () {
                                                  myDefaultDialog(
                                                    'هشدار',
                                                    'آیا از حذف این گزینه اطمینان دارید؟',
                                                    'بله',
                                                    'خیر',
                                                        () {
                                                      Get.back();
                                                      mySnakeBar(
                                                          '',
                                                          'گزینه مورد نظر با موفقیت حذف شد.',
                                                          Icons
                                                              .warning_amber_rounded,
                                                          Colors.yellow);
                                                    },
                                                  );
                                                },
                                                icon: const Icon(
                                                    Icons.delete),
                                                color: Colors.redAccent,
                                              ),
                                              IconButton(
                                                onPressed: () {
                                                  Get.offNamed(
                                                      Routs.editTaskScreen,
                                                      arguments: 'edit');
                                                },
                                                icon: const Icon(
                                                  Icons.edit_calendar,
                                                  color:
                                                  Colors.yellowAccent,
                                                ),
                                              ),
                                            ],
                                          ),
                                        );
                                      },
                                      separatorBuilder:
                                          (BuildContext context,
                                          int index) {
                                        return const Divider(
                                          height: 2,
                                          color: Colors.white70,
                                        );
                                      },
                                    );
                                  }
                              }
                            },
                          ),

这是我函数TaskIconCheckList表单控制器:

functionTaskIconCheckList(int index) {
taskIconCheckList[index].value = !taskIconCheckList[index].value;}

这是updatestatusetask函数

updateStatusTask(int index,int taskKey) async {
print('در تابع آپدیت ایندکس هست: ${index.toString()}');
print('در تابع آپدیت کی هست: ${taskKey.toString()}');
var taskBox = await Hive.openBox('task');
var filterTask = taskBox.values.where((task) => task.key == taskKey).toList();
Task task = Task(
    filterTask[0].taskText,
    filterTask[0].date,
    taskIconCheckList[index].value,
    filterTask[0].deleteStatus,
    null,
    null,
    filterTask[0].taskCatId,
    filterTask[0].userId);
await taskBox.put(taskKey, task);}

这是我showtasklist函数:

Future<List> showTaskList() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
var taskBox = await Hive.openBox('task');

var filterTask = taskBox.values
    .where((task) => task.userId == sharedPreferences.getInt('key'))
    .toList();
return filterTask;}

这是我模型:

@HiveType(typeId: 2)
class Task  extends HiveObject{

  @HiveField(0)
  String taskText;
  @HiveField(1)
  DateTime date;
  @HiveField(2)
  bool status;
  @HiveField(3)
  bool deleteStatus;

  @HiveField(4)
  int taskCatId;

  @HiveField(5)
  int userId;

  @HiveField(6)
  User? user;

  @HiveField(7)
  TaskCat? taskCat;

  Task(this.taskText, this.date, this.status, this.deleteStatus, this.user,
      this.taskCat, this.taskCatId, this.userId);
}
2skhul33

2skhul331#

一个可能的解决方案是等待Future函数完成,然后加载列表。如果它试图在Future函数完成之前加载列表,它可能会假定值为空。
希望这对你有帮助。

brc7rcf0

brc7rcf02#

我仍然不知道是什么原因导致这个问题,但我找到了一个替代的临时解决方案。我创建临时Int列表。然后就在futureBuilder主体中的返回listTile之前,我编写了循环并保存该列表中的所有键。最后,而不是传递“data[index]. key”。我从该临时Int列表传递我的键。所以现在一切都正常工作
这是我之前代码更改部分,但我仍然想知道主要的解决方案。

return ListView.separated(
                                            scrollDirection: Axis.vertical,
                                            physics:
                                                const BouncingScrollPhysics(),
                                            shrinkWrap: true,
                                            itemCount: data.length,
                                            itemBuilder: (context, index) {
                                              // controller.taskIconCheckList
                                              //     .clear();

                                              for (int i = 0;
                                                  i < data.length;
                                                  i++) {
                                                Get.find<
                                                    HomeScreenController>()
                                              .taskKey.add(data[i].key);
                                                if (data[i].status == true) {
                                                  Get.find<
                                                          HomeScreenController>()
                                                      .taskIconCheckList
                                                      .add(true.obs);
                                                } else {
                                                  Get.find<
                                                          HomeScreenController>()
                                                      .taskIconCheckList
                                                      .add(false.obs);
                                                }
                                              }
                                              return ListTile(

相关问题