【问题标题】:Expected a value of type 'ImageProvider<Object>', but got one of type 'Image'需要类型为 \'ImageProvider<Object>\' 的值,但得到类型为 \'Image\' 的值之一
【发布时间】:2022-10-07 04:16:24
【问题描述】:

我正在用颤振构建一个网络应用程序,我想要一个更改个人资料图片的选项。要从图库中选择图像,我使用 image_picker_web 2.1.1 包。

class ImagePickerService {
  late Image? img = Image.asset(\'whatever\'); //has to be initialised
  Future<void> pickImage() async {
    img = await ImagePickerWeb.getImageAsWidget();
  }
}

我没有将 pickImage() 的类型设置为 Future<Image?> 因为我必须从 Future 转换。这个资产(\'whatever\'),虽然不是很优雅,但不会造成任何问题,因为在选择图像时_fileLoaded 设置为true 之前,我将用户名的首字母显示为头像。没有它,我得到一个没有初始化的错误。

设置页面类中的相关 sn-ps:

  late Image? avatar;
  bool _fileLoaded = false;
  final ImagePickerService _ips = ImagePickerService();


  Center(
            child: displayAvatar(),
          ),
  TextButton.icon(
            onPressed: () {
              setState(() {
                _ips.pickImage();
                avatar = _ips.img;
                _fileLoaded = true;
              });
            },
            icon: const Icon(Icons.edit),
            label: const Text(\'Change avatar\'),
          ),


  Widget displayAvatar() {
    if (_fileLoaded) {
      return CircleAvatar(
          backgroundImage: avatar as ImageProvider, radius: 50.0);
    } else...

我搜索了类似的问题,但除了添加 as ImageProvider 之外没有找到任何答案,在我的情况下,它会从 IDE 中删除错误并让我运行项目,但是当我按下按钮来更改头像,即使类型应该是正确的。请问,你知道有什么解决办法吗?

    标签: flutter web


    【解决方案1】:

    ImageProvider 是一个抽象类。实现 ImageProvider 的类有 AssetImage("")、NetworkImage("URL")、FileImage() 等。我相信 FileImage 应该非常适合您的情况。

    【讨论】:

      【解决方案2】:

      我正在发布解决方案,以防有人遇到同样的问题。 我切换回 image_picker 包,它也支持 web,你只需要稍微不同地使用它:

      class ImagePickerService {
        final ImagePicker _picker = ImagePicker();
        Uint8List picked = Uint8List(8);
        Future<void> pickImage() async {
          XFile? image = await _picker.pickImage(source: ImageSource.gallery);
          if (image != null) picked = await image.readAsBytes();
        }
      }
      
      ClipOval(
              child: Image.memory(
                avatar,
                fit: BoxFit.cover,
                width: 100.0,
                height: 100.0,
              ),
            )
      

      avatar 分配给 _ips.picked,所以它是 Uint8List 类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-14
        • 2022-01-26
        • 2021-12-04
        • 2021-09-18
        • 2021-06-06
        • 2023-02-09
        • 2021-07-13
        • 2021-12-27
        相关资源
        最近更新 更多