我正在使用下面的代码从画廊中上传图片,如果万一未从画廊中拿起图片,我希望将assets
中的图片上传到Firebase存储中,为此avatarImageFile
应该等效于资产中的图像文件。
我该如何实现?
Future getImage() async {
print("get image");
PickedFile image = await _picker.getImage(source: ImageSource.gallery);
if (image != null) {
setState(() {
final File file = File(image.path);
avatarImageFile = file;
isLoading = true;
});
}
else{
//if image is null then the image from the assets should be made picked into `avatarImageFile `
}
}
答案 0 :(得分:1)
在Flutter中,您可以通过两种方式加载资产:
使用rootBundle.loadString("assets/my_file.json")
加载文本文件
使用rootBundle.load("assets/something.png")
加载任何类型的文件(图像,pdf或任何其他类型的二进制文件)。
请注意,load
也适用于.json文件,但通常在检索文本时,loadString是更好的选择。有关更多信息,请阅读doc。
avatarImageFile = await rootBundle.load("assets/a/b/c.png");
在小部件内部时不要使用rootBundle:相反,最好使用DefaultAssetBundle
:
class MyWidget extends StatelessWidget {
const MyWidget();
Future<String> loadConfig(BuildContext context) async =>
await DefaultAssetBundle
.of(context)
.loadString("myassets/some_cfg.json");
@override
Widget build(BuildContext context) {...}
}
同样,当您位于小部件内时,请执行以上操作。在任何其他情况下,请使用rootBundle
。