如何解决Flutter / Dart-图片已更改,但URL未更改,因此提供商的消费者未刷新
一旦新照片上传到服务器上以替换旧照片,我正在使用Provider with ChangeNotifier
提醒Consumer
。问题在于URL保持不变,因为照片仅被覆盖并保持相同名称。因此,消费者无法识别任何更改,也不会用新照片刷新旧照片。
我如何欺骗ChangeNotifier刷新URL?这是我构建中的Consumer
;
Consumer<SocialProvider>(
builder: (context,socialProvider,child) {
return Image.network(socialProvider.currentavatar,);
}),
在此处是在图库中选择图像并上传以覆盖服务器上的旧图像的地方。
GestureDetector(
onTap: () async {
await socialProvider.loadCurrentUserId();
await _listener.openGallery(socialProvider.currentuserid);
String updatedavatar = "http://example.com/same_photo.jpg";
socialProvider.updateAvatar(updatedavatar);
},
这是带有ChangeNotifier的提供程序中的代码;
Future<void> updateAvatar(String avatar) async {
var box = await Hive.openBox('currentuser');
box.put('currentavatar',avatar);
currentavatar = avatar;
notifyListeners();
}
有什么主意如何诱使Consumer
认为URL已更改,以便刷新?
解决方法
我相信当有人致电Consumer
时notifyListeners()
将会重建。您的问题可能出在Image.network(socialProvider.currentavatar,)
中,当一切都没有改变时,抖动会重复使用同一渲染对象。您可以尝试添加key:UniqueLey()
,以在每次构建时强制重新构建该窗口小部件。
以一些假设进行更新。 这是我尝试重建环境的简单代码:
class SimpleProvider with ChangeNotifier {
Future<void> reload() async => notifyListeners();
}
class TestConsumer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ChangeNotifierProvider(
create: (context) => SimpleProvider(),child: Consumer<SimpleProvider>(
builder: (_,simpleProvider,child) {
print('Consumer build');
return child; // Here is your Image?
},child: Builder(
builder: (context) {
print('Builder build');
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read<SimpleProvider>().reload();
},),body: Container(),);
},);
}
}
每次单击按钮时,SimpleProvider
都会呼叫notifyListeners()
(不需要将来),将调用builder
中的Consumer
函数。问题来了:
- 使用notifyListeners时真的会调用
builder
吗?
我假设调用了builder函数。您仍然可以仔细检查这一部分。否则,您必须提供调用方式。
- 如果调用了
builder
,为什么不重建其中的Image Widget?
这是颤振设计的一部分,为了达到更好的性能,它会尽可能地重复使用。有时它使人们感到困惑,即重建没有发生。我猜那是您的问题所在。您可以在以下视频中查看基本机制: documentation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。