类型 '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))
我最近将我的 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))