【问题标题】:type 'FutureBuilder<File>' is not a subtype of type 'ImageProvider<dynamic>' - Image Picker problem'FutureBuilder<File>' 类型不是 'ImageProvider<dynamic>' 类型的子类型 - 图像选择器问题
【发布时间】:2020-10-18 23:44:54
【问题描述】:

我需要在容器中添加图像。图片来自 IMAGE PICKER。 我得到了错误:

 type 'FutureBuilder<File>' is not a subtype of type 'ImageProvider<dynamic>'

这是原始代码:

                                      Container( //<-- HEADER CONTAINER
                                        height: kHeaderHeight,
                                        width: kHeaderWidth,
                                        decoration:
                                        BoxDecoration(
                                          image: DecorationImage(
                                            image:
                                            _imageFileForHeader.path != null?
                                            FutureBuilder(
                                                future: _getLocalFile(_imageFileForHeader.path),
                                                builder: (BuildContext context, AsyncSnapshot<io.File>  snapshot)
                                                {
                                                  return Image.file(snapshot.data);
                                                }
                                            ):
                                                NetworkImage(urlImage + _kHeaderImage),  fit: BoxFit.cover,
                                          ),
                                        ),

我真的可以在这里得到任何帮助。

如果用户没有从图库中选择图片 - 则使用 URL (urlImage) 中的图片。

我认为我正在做一个非常标准的例程,我不明白为什么它不起作用。

谢谢

-- 我只想补充一点,我也试过了:

return FileImage(snapshot.data) 

这也不起作用。

我想我在这里用尽了所有可能的排列方式。

顺便说一下,这里是 _getLocalFile...

  Future<io.File> _getLocalFile(String filename) async
  {
    io.File f = new io.File(filename);
    return f;
  }

【问题讨论】:

  • 你能显示_getLocalFile吗?我不确定你是否需要那个未来......

标签: flutter dart future imagepicker


【解决方案1】:

_getLocalFile 不需要任何未来,因为内部没有异步操作。你可以这样做

return Container( //<-- HEADER CONTAINER
    height: kHeaderHeight,
    width: kHeaderWidth,
    decoration:
    BoxDecoration(
        image: DecorationImage(
        image: _imageFileForHeader?.path != null
                ? Image.file(File(_imageFileForHeader.path)) 
                : Image.network(urlImage + _kHeaderImage);
        ),
    ),

或者假设 _imageFileForHeader 已经是一个文件,我们可以进一步简化它

return Container( //<-- HEADER CONTAINER
    height: kHeaderHeight,
    width: kHeaderWidth,
    decoration:
    BoxDecoration(
        image: DecorationImage(
        image: _imageFileForHeader != null
                ? Image.file(_imageFileForHeader) 
                : Image.network(urlImage + _kHeaderImage);
        ),
    ),

【讨论】:

  • 谢谢,但是有了这个克劳迪奥,我得到:在 null 上调用了 getter 'path'。接收者:null 尝试调用:路径
  • 谢谢.. 路径错误是我的错.. 但你是对的——还有保罗。我很感激
  • @houba:_imageFileForHeader 是什么类型?那是一个文件吗?
  • 我想我需要在颤振中重新开始我的课程......谢谢先生。 _imageFileForHeader 被定义为: _imageFileForHeader = await picker.getImage(source: ImageSource.gallery); --> 这不是我需要的。我需要路径。
【解决方案2】:

我认为您的 _getLocalFile 函数返回了错误的数据类型。也许如果您尝试以下方法:

Future<File> _getLocalFile() async{
  final ImagePicker _picker = ImagePicker();
  PickedFile pickedFile= await _picker.getImage(source: ImageSource.gallery);
  File file =  File(pickedFile.path);
  return file;
}

此外,我不相信您可以将 FutureBuilder 用于容器图像变量。要在 Container 中显示图像,您可以使用:

File file;

Container(
  decoration: new BoxDecoration(
    image: new DecorationImage(
      fit: BoxFit.cover,
      image: new FileImage(file),
    ),
  ),
),

所以我认为您必须检查文件变量是否为空,如果为空,则可能显示一个按钮。如果用户按下按钮,您可以调用异步 _getLocalFile 函数,然后使用 setState 进行更新以显示图像。

也许您也可以将图像包裹在 FutureBuilder 周围:


    FutureBuilder<File>(
        future: _getLocalFile(),
        builder: (BuildContext context, AsyncSnapshot<File>  snapshot)
        {
          if(!snapshot.hasData){
            return CircularProgressIndicator();
          }else{
            return Container(
              decoration: new BoxDecoration(
                image: new DecorationImage(
                  fit: BoxFit.cover,
                  image: new FileImage(snapshot.data),
                ),
              ),
            );
          }
        }
    );

【讨论】:

  • 谢谢保罗...它看起来和我的功能很相似,但还是让我试试吧..
  • 嗨,没问题。但我认为主要问题是你不能将 FutureBuilder 用作 ImageProvider :) 也许如果你将 FutureBuilder 包裹在容器周围,它可以工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2018-12-14
  • 2021-12-02
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多