断言失败:854行pos 14:'file!= null':不正确

时间:2020-11-03 12:58:58

标签: flutter dart

我正在尝试使用 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中的那个),但仍显示相同的错误。任何指导将不胜感激。谢谢!

4 个答案:

答案 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版本是正确的。