如何显示本地存储中的图像

How to display an image from local storage

我用相机拍了一张照片,我得到了它的路径

/data/user/0/com.example.tarea_8/cache/CAP8057460019038129642.jpg

我试过这样显示的

var imagePath = '/data/user/0/com.example.tarea_8/cache/CAP8057460019038129642.jpg';
Image.file(File(imagePath));

但是我遇到了这个错误

The argument type 'File (where File is defined in C:\flutter\bin\cache\pkg\sky_engine\lib\html\html_dart2js.dart)' can't be assigned to the parameter type 'File (where File is defined in C:\flutter\bin\cache\pkg\sky_engine\lib\io\file.dart)'. (Documentation) 

File is defined in C:\flutter\bin\cache\pkg\sky_engine\lib\html\html_dart2js.dart (html_dart2js.dart:144).

File is defined in C:\flutter\bin\cache\pkg\sky_engine\lib\io\file.dart (file.dart:144).

2 positional argument(s) expected, but 1 found. (Documentation) 

dart:html (new) File File(   List  fileBits,   String fileName, [   Map ? options, ]

我在 3 年前看到有人遇到过同样的问题 。我严格按照解决步骤进行操作,但它对我不起作用。

我正在使用 Android Studio,安装的插件版本是 Dart 211.7808 & Flutter 65.2.2

您首先需要获得的是申请文件目录。 使用 path_provider 包。 https://pub.dev/packages/path_provider

path_provider: ^2.0.9

现在你有两个选择,如果你使用像(riverpod 或 bloc)这样的状态管理,你可以在其中制作逻辑,但如果你不使用任何状态管理,你可以使用 FutureBuilder 来获取路径并显示图像

  @override
Widget build(BuildContext context) {
return new MaterialApp(
    title: 'Flutter Demo',
    home: new FutureBuilder(
        future: _getLocalFile("flutter_assets/image.png"),
        builder: (BuildContext context, AsyncSnapshot<File> snapshot) {
          return snapshot.data != null ? Image.file(snapshot.data) : new Container();
        })
);
}

Future<File> _getLocalFile(String filename) async {
String dir = (await getApplicationDocumentsDirectory()).path;
File file = new File('$dir/$filename');
return file;

}

检查你的 imports 这个错误说的是 dart:htmldart:io 中定义的文件 ID。

solution 1: 如果您不使用 dart:html 的功能,请将其从导入中删除,您的代码将为 运行。 (我说的是第一个解决方案,因为 dart:html 只能在 flutter web 上运行,而 dart:io 不能在 web 上运行。

solution 2: 您必须将任何一个库作为命名导入导入,然后使用。 (import alies/named imports)

import 'dart:async';
import 'my_library.dart' as myLib;

void main() {
  Stream stream = new Stream.fromIterable([1, 2]); // from async
  myLib.Stream myCustomStream = new myLib.Stream(); // from your library
}