类型 'Future<PickedFile?>' 不是类型 'Future<File>' 的子类型,迁移到 null 安全后出错

type 'Future<PickedFile?>' is not a subtype of type 'Future<File>' , error after migrating to null safety

我最近将我的 flutter 应用程序迁移到了 null safety 2.12.0,我不得不对我的代码进行大量更改,而且我只停留在我的图像选择器和上传功能上。我设法更改了空接受变量。应用程序运行没有问题,但在选择图像后,它没有显示在 ui 中,或者继续使用其他需要 uires 图像文件数据的管道函数。我对 flutter 还很陌生,而这种突然的 flutter 变化引起了很多混乱。我非常感谢这个问题的解决方案以及将来避免此类问题的良好解释,谢谢!

Git 整个代码“https://github.com/sudaraka93/stack.git”

  late SharedPreferences sharedPreferences;
  late Size deviceSize;
  Future<File>? file;
  late String base64Image;
  String status = '';
  late File tmpFile;
  String errMessage = 'Error Uploading Image';
  DateTime selectedDate = DateTime.now();
  final TextEditingController CommentController = new TextEditingController();


  @override
  void initState() {
  }

  chooseImage() {
    setState((){
      file =  ImagePicker().getImage(source: ImageSource.gallery) as Future<File>;
    });
  }

  startUpload()async {
    setStatus('Uploading Image...');
    if (null == tmpFile) {
      setStatus(errMessage);
      return;
    }
    String fileName = tmpFile.path.split('/').last;
    upload(base64Image);
  }
  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:Container(
                child:Image.file(
                  snapshot.data!,
                  fit: BoxFit.fill,
                ),
              )
          );
        } else if (null != snapshot.error) {
          return const Text(
            '画像の選択エラー',
            textAlign: TextAlign.center,
          );
        } else {
          return const Text(
            '画像が選択されていません',
            textAlign: TextAlign.center,
          );
        }
      },
    );
  }

ImagePicker 不再使用 File 作为数据类型,您必须使用 PickedFile

改变一下

Future<File>? file

Future<PickedFile>? file

tmpFile 的数据类型更改为 PickedFile。像这样转换为 base64

base64Image = base64Encode(File(snapshot.data.path).readAsBytesSync());

然后为了显示图像使用像这样的楔形

Image.file(File(snapshot.data.path))