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
中。