参数类型“文件?”不能分配给参数类型 'Future<File>?'

Posted

技术标签:

【中文标题】参数类型“文件?”不能分配给参数类型 \'Future<File>?\'【英文标题】:The argument type 'File?' can't be assigned to the parameter type 'Future<File>?'参数类型“文件?”不能分配给参数类型 'Future<File>?' 【发布时间】:2022-01-14 08:03:42 【问题描述】:
  File ? file;
  String status = '';
  String ? base64Image;
  File ? tmpFile;
  String errMessage = 'Error Uploading Image';

chooseImage() async 
      var image = await ImagePicker().pickImage(source: ImageSource.gallery);
      setState(() 
        file = File(image!.path);
      );
    setStatus('');
    print(base64Image);
  

startUpload() 
    setStatus('Uploading Image...');
    if (null == tmpFile) 
      setStatus(errMessage);
      return;
    
    String fileName = tmpFile!.path.split('/').last;
    upload(fileName);
  
  setStatus(String message) 
    setState(() 
      status = message;
    );
  

  upload(String fileName) 
    http.post(Uri.parse(URL), body: 
      "image": base64Image,
      "name": fileName,
    ).then((result) 
      setStatus(result.statusCode == 200 ? result.body : errMessage);
    ).catchError((error) 
      setStatus(error);
    );
  


Widget showImage() 
    return FutureBuilder<File>(
      future: file,
      builder: (BuildContext context, AsyncSnapshot<File> snapshot) 
        if (snapshot.connectionState == ConnectionState.done &&
            null != snapshot.data) 
          tmpFile = snapshot.data;
          base64Image = base64Encode(snapshot.data!.readAsBytesSync());
          return Flexible(
            child: Image.file(
              snapshot.data!,
              fit: BoxFit.fill,
            ),
          );
         else if (null != snapshot.error) 
          return const Text(
            'Error Picking Image',
            textAlign: TextAlign.center,
          );
         else 
          return const Text(
            'No Image Selected',
            textAlign: TextAlign.center,
          );
        
      ,
    );
  

我正在尝试选择一个图像并将其转换为 base64

【问题讨论】:

future: file, 这是违规行。 file 是一个 File? 对象。 FutureBuilder 需要某种 Future。你想用那个FutureBuilder做什么?我想这就是你想要的:future: chooseImage(),. 【参考方案1】:

你不需要使用 FutureBuilder 来使用 File 而是直接使用它:

Widget showImage() 
  if (file != null) 
    tmpFile = file!;
    base64Image = base64Encode(file!.readAsBytesSync());
    return Flexible(
      child: Image.file(
        file!,
        fit: BoxFit.fill,
      ),
    );
   else 
    return const Text(
      'No Image Selected',
      textAlign: TextAlign.center,
    );
  
```

【讨论】:

以上是关于参数类型“文件?”不能分配给参数类型 'Future<File>?'的主要内容,如果未能解决你的问题,请参考以下文章

参数类型“对象?”不能分配给参数类型“字符串”

参数类型“Function”不能分配给参数类型“void Function()?”在零安全之后

参数类型“Future<bool>”不能分配给参数类型“bool”

“数字”类型的参数不能分配给“数字和字符串”类型的参数

颤振列表错误参数类型'List'不能分配给参数类型'String'

获取错误“未知”类型的参数不能分配给“错误”类型的参数 |空值'