Flutter 应用程序,ListView.builder 首次运行时出现错误。需要重启应用(ListView.builder 和 image_picker)

Posted

技术标签:

【中文标题】Flutter 应用程序,ListView.builder 首次运行时出现错误。需要重启应用(ListView.builder 和 image_picker)【英文标题】:Flutter app, ListView.builder pictures errors at first run. Need restart app (ListView.builder and image_picker) 【发布时间】:2021-06-01 07:42:22 【问题描述】:

我发现了 Flutter,在我的应用开发过程中遇到了一个问题。

我在我的数据库中添加了一个杂项,以及通过 image_picker 拍摄的照片的数据和链接。 我使用 ListView.builder 在应用程序主页上显示这些杂项的列表。

第一次打开应用程序时,出现找不到图像的错误。 我必须重新启动应用程序以避免错误。

我一定是错过了什么,有人可以帮我吗?

这是处理图像捕获并保存它的函数。

Future getImage() async 
  final PickedFile pickedFile = await picker.getImage(source: ImageSource.camera);
  final Directory directory = await getExternalStorageDirectory();
  final String path = directory.path;
  final String filename = basename(pickedFile.path);
  final File newFile = await moveFile(File(pickedFile.path), '$path/$filename');
  setState(() 
    _image = newFile;
  );

这里显示列表。

ListView.builder(
  itemCount: widget.markers.length,
  itemBuilder: (BuildContext context, int index) 
    return ListTile(
      leading: CircleAvatar(
      backgroundImage: AssetImage(widget.markers[index].image),
    ),
    title: Text('title')
  );
)

第一次运行有错误:

**
════════ Exception caught by image resource service ════════════════════════════
The following assertion was thrown resolving an image codec:
Unable to load asset: /storage/emulated/0/android/data/com.example.flutter_locate_reminder/files/89d7c94f-072a-4308-88d7-2d24b8ca744f9044594904088454133.jpg

When the exception was thrown, this was the stack
#0      PlatformAssetBundle.load
package:flutter/…/services/asset_bundle.dart:225
<asynchronous suspension>
#1      AssetBundleImageProvider._loadAsync
package:flutter/…/painting/image_provider.dart:668
#2      AssetBundleImageProvider.load
package:flutter/…/painting/image_provider.dart:651
#3      ImageProvider.resolveStreamForKey.<anonymous closure>
package:flutter/…/painting/image_provider.dart:504
...
Image provider: AssetImage(bundle: null, name: "/storage/emulated/0/Android/data/com.example.flutter_locate_reminder/files/89d7c94f-072a-4308-88d7-2d24b8ca744f9044594904088454133.jpg")
Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#1fb35(), name: "/storage/emulated/0/Android/data/com.example.flutter_locate_reminder/files/89d7c94f-072a-4308-88d7-2d24b8ca744f9044594904088454133.jpg", scale: 1.0)
════════════════════════════════════════════════════════════════════════════════

它似乎没有立即找到图像。

感谢您的帮助;)

【问题讨论】:

【参考方案1】:

获取图片

final image = await picker.getImage(source: ImageSource.camera);
setState(() 
  _image = File(image.path);
);

显示图片

backgroundImage: Image.file(_image),

我认为这足以获取并显示图像。

【讨论】:

感谢您的帮助!但我不能分配 backgroundImage: Image.file(_image) 与 image.file(File(_image)); 相同backrgoundImage 需要 ImageProvider 而不是文件。所以,我可以解决我的问题: backgroundImage: FileImage(File(_image)) 谢谢你兄弟的正确轨道;)【参考方案2】:

使用Image.file(File file) 代替 AssetImage。

  itemCount: widget.markers.length,
  itemBuilder: (BuildContext context, int index) 
    return ListTile(
      leading: CircleAvatar(
      backgroundImage: Image.file(widget.markers[index].image),
    ),
    title: Text('title')
  );
)````

【讨论】:

以上是关于Flutter 应用程序,ListView.builder 首次运行时出现错误。需要重启应用(ListView.builder 和 image_picker)的主要内容,如果未能解决你的问题,请参考以下文章

图片的无限ListView冻结应用程序或在布局期间抛出异常[包括小应用程序]

Flutter 小部件与 Flutter 驱动程序

无法使用 Flutter 1.22.3 编译 Flutter 应用程序

Flutter:flutter_driver 错误消息和应用程序屏幕在测试时保持黑色

Flutter - 生成 Flutter 应用程序 apk 时出错

Flutter 调味移动应用和 Flutter web