我正在尝试使用 FileImage()显示图像,但是会引发“ 'file!= null':不正确”错误。图像来自图像选择器功能。奇怪的是,我知道该文件存在,因为当我尝试打印该文件时,它会向我显示文件的路径。
编辑:如果您需要检查以下代码,则为完整代码的链接: https://github.com/MBanawa/ecommerce_app/blob/master/lib/Admin/uploadItems.dart
以下是具有打印方法的ImagePicker的功能:
File imageFile;
pickImage(ImageSource imageSource) async {
Navigator.pop(context);
final pickedFile = await ImagePicker().getImage(source: imageSource);
setState(() {
imageFile = File(pickedFile.path);
print('Path $imageFile');
});
}
我通过相机或图库在 onPressed()中触发该功能:
相机:
onPressed: () => pickImage(ImageSource.camera),
图库
onPressed: () => pickImage(ImageSource.gallery),
下面是我如何调用imageFile:
Container(
height: 230.0,
width: MediaQuery.of(context).size.width * 0.8,
child: Center(
child: AspectRatio(
aspectRatio: 16 / 9,
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: FileImage(imageFile),
fit: BoxFit.cover,
),
),
),
),
),
),
上面的容器位于名为 displayAdminUploadFormScreen()的函数内,如果imageFile不为null,则该函数将被调用。我将其放在statefulwidget状态的构建方法之后:
@override
Widget build(BuildContext context) {
return imageFile == null
? displayAdminHomeScreen()
: displayAdminUploadFormScreen();
}
我很困惑的是,print()在拍照后返回了实际的链接。这是使用相机拍照时的示例结果:
I/flutter (16227): Path File: '/storage/emulated/0/Android/data/com.example.ecommerceapp/files/Pictures/068e58d6-88af-4b13-9453-c8c8d836083c5388058709499582194.jpg'
确切的错误信息是:
The following assertion was thrown building UploadPage(dirty, dependencies:
[MediaQuery, _InheritedTheme, _LocalizationsScope-[GlobalKey#71a32]], state: _UploadPageState#0a649):
'package:flutter/src/painting/image_provider.dart': Failed assertion: line 854 pos 14: 'file !=
null': is not true.
在检查该错误给出的链接时,它指向 FileImage(imageFile)。如果我打开FileImage,则第854行pos 14是一个断言:
const FileImage(this.file, { this.scale = 1.0 })
: assert(file != null),
assert(scale != null);
我还尝试了创建ImagePicker函数的传统方法。 (pub.dev中的那个),但仍显示相同的错误。任何指导将不胜感激。谢谢!
答案 0 :(得分:1)
这是因为您正在clearFormInfo()
小部件内调用IconButton
函数。我相信您想在回调onPressed
属性内调用此函数。
所以代替:
leading: IconButton(
icon: Icon(
Icons.arrow_back,
color: Colors.white,
),
onPressed: clearFormInfo(),
)
请使用:
leading: IconButton(
icon: Icon(
Icons.arrow_back,
color: Colors.white,
),
onPressed: () {
clearFormInfo();
},
),
答案 1 :(得分:-1)
您需要检查imageFile是否为空。如果是这样,则可以使用一个简单的Container直到imageFile不为null。尝试这样的事情:
Container(
height: 230.0,
width: MediaQuery.of(context).size.width * 0.8,
child: Center(
child: AspectRatio(
aspectRatio: 16 / 9,
child: imageFile != null // Here is important!
? Container(
decoration: BoxDecoration(
image: DecorationImage(
image: FileImage(imageFile),
fit: BoxFit.cover,
),
),
)
: Container(),
),
),
),
答案 2 :(得分:-1)
displayAdminUploadFormScreen()是函数而不是窗口小部件对吗?
那么这个函数可以正确获取imageFile的值吗?
尝试在此功能开始时打印imageFile,以检查是否正确获取了图像路径。
displayAdminUploadFormScreen(){
print(imagePath);
.
// rest of code
.
}
如果结果为空,那么您可能需要传递imageFile
displayAdminUploadFormScreen(File imageFile){
print(imagePath);
.
// rest of cocde
.
}
和
@override
Widget build(BuildContext context) {
return imageFile == null
? displayAdminHomeScreen()
: displayAdminUploadFormScreen(imageFile);
}
答案 3 :(得分:-2)
您是否已在Info.plist和AndroidManifest.xml文件中设置权限?
在** / path / to / project / android / app / src / [debug / main / profile] 里面,您需要输入类似
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在** / path / to / project / ios / Runnmer / Info.plist 里面,您需要输入类似
<key>NSCameraUsageDescription</key>
<string>camera</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We need access to your photos for this</string>
由于我尚未为Android开发,因此我不确定100%使用Android,但我确定iOS版本是正确的。