如何解决我可以在后台运行“ image.dart”功能吗?
我要在压缩所选图像时显示加载小部件。
我正在使用“ image.dart”包通过ImagePicker.Getimage()选择一个图像。
然后,我想在压缩图像时显示加载小部件,并在完成时显示压缩图像。
我的代码从根本上可以工作,我的加载小部件很酷(感谢spinkit),我可以选择任何图像,将其压缩并显示新图像,但是在压缩图像时会出现少量冻结(2-3秒)。
因此,我试图放置一个加载小部件以免引起用户恐慌,并轻按10000次以选择所需的图像,但是我对异步代码还不完全满意。
这是我的代码:
import 'package:image/image.dart' as Img;
@override
Widget build(BuildContext context) {
if (loading == true) {
return LoadingScreen();
} else {
return Scaffold(
backgroundColor: Colors.brown[300],body: Column(
children: [
SizedBox(
height: 50,),RaisedButton(
child: Text('Select an image'),onpressed: () async {
await getimage();
// You can see here that I'm trying to trigger the loading widget
setState(() {
loading = true;
});
compressImage();
// And I want to disable the loading widget here,after the compression
setState(() {
loading = false;
});
},SizedBox(
height: 10,pickedImage != null ? printSelectedImage() : Center(child: Text('Please select an image')),],);
}
}
getimage() async {
pickedFile = await picker.getimage(source: ImageSource.gallery);
}
compressImage() async {
Img.Image selectedImage = Img.decodeJpg(File(pickedFile.path).readAsBytesSync());
if (selectedImage.width > selectedImage.height) {
Img.Image compressedImage = Img.copyResize(selectedImage,width: 500);
File(pickedFile.path).writeAsBytesSync(Img.encodePng(compressedImage));
} else {
Img.Image compressedImage = Img.copyResize(selectedImage,height: 500);
File(pickedFile.path).writeAsBytesSync(Img.encodePng(compressedImage));
}
if (pickedFile.path != null) {
setState(() {
pickedImage = pickedFile.path;
});
}
}
但是结果是一样的,压缩时屏幕仍然停留在文件选择器中,然后直接显示压缩的图像。
我两周前开始学习dart / Flutter,所以我错过了飞镖语言的一些基本原理吗?我没有看到明显的东西吗?
感谢您的阅读
解决方法
制作async
并不会将其移动到某些神奇的后台线程中。 Dart使用isolates,基本上是可以在其中运行Dart代码的执行上下文。 Flutter有一个单独的隔离程序可以运行您的应用程序,如果您在其中执行过多的工作,则应用程序会变慢或跳过帧。
您可以创建其他隔离,以进行计算和卸载工作,并通过来回传递带有原始内容的消息来在隔离之间进行通信。 Flutter的缺点是,其他隔离无法访问Flutter插件,因此很多东西在那里无法正常工作。 有多种方法可以解决此问题,但是它们涉及很多。
启动隔离的最简单方法是compute(callback,message)
函数。
生成隔离对象,在该隔离对象上运行
callback
,将其传递给message
,然后
(最终)返回callback
返回的值。
我不确定image/image.dart
库是否使用了插件或某些其他不可用的功能(例如dart:ui
),您可以尝试将图像压缩卸载到回调中。如果失败并显示MissingPluginException
或类似内容,则它将无法正常工作。
请记住,您只能传递原始消息,因此无法传递pickedFile
,只能传递as参数。
但是,对于您的问题,可能会有更简单的解决方案。图像选择器接受最大宽度/高度和质量的参数。但是,如果您需要将图像编码为PNG,则需要自己创建一个复杂的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。