Flutter:如何在dart中的背景线程上运行函数


Future getImage() async {
var image = await ImagePicker.pickImage(source: ImageSource.camera);
setState(() {
_image = image;
print("IMG:" + _image.toString());
});
setPrefs() ;
}
Future setPrefs() async {
_base64 = base64.encode(_image.readAsBytesSync());
print(_base64);
final prefs = await SharedPreferences.getInstance();
prefs.setString(IMAGE_KEY, _base64);
}

readAsBytesSync()方法在Android上运行良好,但在iOS中运行太慢。那么,我如何将这些代码移动到一个新的后台线程呢?

1。使用未来

您可以使用异步版本的readAsBytes

所以不是:

final imageData = _image.readAsBytesSync();
_base64 = base64.encode(imageData);

你可以有:

final imageData = await _image.readAsBytes();
_base64 = base64.encode(imageData);

2.使用隔离

在您的代码中,可能不一定是readAsBytes行速度较慢。它可能是图像的基本64个编码。如果是这种情况,您可以将整个计算放入单独的隔离中。你可以使用一种方便的计算方法。

// This needs to be a global function
encodeImage(File imageFile) {
return base64.encodeimageFile.readAsBytesSync());
}
Future setPrefs() async {
_base64 = await compute(encodeImage, _image);
print(_base64);
final prefs = await SharedPreferences.getInstance();
prefs.setString(IMAGE_KEY, _base64);
}

此外,值得一提的是,SharedPreferences(适用于Android,也就是iOS上的NSUserDefaults(旨在存储小型用户设置。它不是为存储图像而设计的,因为图像可能有兆字节大。最好将图像文件复制到应用程序的文档文件夹中,并且只将文件名存储在SharedPreferences中。

最新更新