0

一旦将新照片上传到服务器以替换旧照片,我就会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 的 Provider 中的代码;

Future<void> updateAvatar(String avatar) async {
     var box = await Hive.openBox('currentuser');
      box.put('currentavatar', avatar);
      currentavatar = avatar;
      notifyListeners();
     }

任何想法如何欺骗Consumer相信 url 已更改以使其刷新?

4

1 回答 1

0

我相信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() (Future 不是必需的)并且会调用builderin 中的函数Consumer。问题来了:

  1. builder当你使用 notifyListeners 时真的被调用了吗?

我假设调用了构建器函数。您仍然可以仔细检查这部分。否则,您必须提供如何称呼它。

  1. 如果builder被调用,为什么里面的Image Widget没有重建?

它是颤振设计的一部分,它尽可能多地重用,以获得更好的性能。有时它使人们感到困惑的是重建没有发生。那就是我猜你的问题在这里。您可以在此处查看视频中的基本机制: https ://www.youtube.com/watch?v=996ZgFRENMs&ab_channel=Flutter

于 2020-10-13T06:54:01.417 回答