微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以在后台运行“ image.dart”功能吗?

如何解决我可以在后台运行“ 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 举报,一经查实,本站将立刻删除。