在我的应用程序中,我使用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);
});
}
}
帮我一下
1条答案
按热度按时间8gsdolmq1#
ValueNotifier使用相等来检测更改,因此如果您只更改列表的值,dart编译器将不会注意到任何更改,因为列表对象保持不变。
您需要创建一个新的修改列表,类似于以下内容: