如何显示本地存储中的图像
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:html
和 dart: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
}
我用相机拍了一张照片,我得到了它的路径
/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:html
和 dart: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
}