Flutter 值通知器不适用于文件列表

soat7uwm  于 2023-03-24  发布在  Flutter
关注(0)|答案(1)|浏览(109)

在我的应用程序中,我使用photo_manager包来制作一个自定义图像选择器。然后当我使用ValueNotifier时,它没有做任何事情。我想做的是监听更改并相应地更新UI。
值通知程序类

class GalleryValurNotifier {
  ValueNotifier<List<File?>> selectedAssets = ValueNotifier<List<File?>>([]);

  void addNotifier(File? file) {
    selectedAssets.value.add(file);
  }

  void clearNotifier() {
    selectedAssets.value.clear();
  }

  void removeNotifier(File? file) {
    selectedAssets.value
        .removeWhere((element) => element.toString() == file.toString());
  }
}

然后在我的有状态小部件中创建了一个示例

GalleryValurNotifier galleryNotifier = GalleryValurNotifier();

并称之为

Stack(
                children: [
                  ValueListenableBuilder(
                      valueListenable: galleryNotifier.selectedAssets,
                      builder: (context, value, child) {
                        return Container(
                          width: _width,
                          height: _height * 0.45,
                          child: AssetThumbnail(
                            asset: assets[0],
                            // selected: value,
                          ),
                        );
                      }),
                  Positioned(
                    top: 0,
                    child: ValueListenableBuilder(
                        valueListenable: galleryNotifier.selectedAssets,
                        builder: (context, value, child) {
                          return Container(
                            height: _height * 0.1,
                            width: _width,
                            padding:
                                EdgeInsets.symmetric(horizontal: _width * 0.02),
                            child: Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: [
                                IconButton(
                                    onPressed: () {
                                      Get.back();
                                    },
                                    icon: const Icon(CupertinoIcons.back)),
                                value.isNotEmpty
                                    ? FutureBuilder<File?>(
                                        future: assets[0].file,
                                        builder: (context, snapshot) {
                                          final file = snapshot.data;
                                          return InkWell(
                                            onTap: () {
                                              if (value != null) {
                                                Get.to(
                                                    ImagePost(images: value));
                                              } else {
                                                // Get.to(ImagePost(images: selectedAssets));
                                              }
                                            },
                                            child: Row(
                                              children: [
                                                Text("NEXT"),
                                                SizedBox(
                                                  width: _width * 0.02,
                                                ),
                                                Icon(CupertinoIcons.check_mark)
                                              ],
                                            ),
                                          );
                                        })
                                    : Container()
                              ],
                            ),
                          );
                        }),
                  )
                ],
              ),

在缩略图小部件中,我调用了函数,但它没有更新,甚至没有给它赋值。

onTap: () {
final idx = galleryNotifier.selectedAssets.value.indexWhere(
                        (element) => element.toString() == file.toString());

                    if (idx >= 0) {
                      setState(() {
                        galleryNotifier.removeNotifier(file);
                      });
                    } else {
                      setState(() {
                        galleryNotifier.addNotifier(file);
                      });
                    }

}

帮我一下

8gsdolmq

8gsdolmq1#

ValueNotifier使用相等来检测更改,因此如果您只更改列表的值,dart编译器将不会注意到任何更改,因为列表对象保持不变。
您需要创建一个新的修改列表,类似于以下内容:

class GalleryValurNotifier {
  ValueNotifier<List<File?>> selectedAssets = ValueNotifier<List<File?>>([]);

  void addNotifier(File? file) {
    selectedAssets.value = List.from(selectedAssets.value)..add(file);
  }

  void clearNotifier() {
    selectedAssets.value = [];
  }

  void removeNotifier(File? file) {
    selectedAssets.value = List.from(selectedAssets.value)..removeWhere((element) => element.toString() == file.toString());
  }
}

相关问题