Kri*_* CN 7 asynchronous async-await background-thread dart flutter
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);
}
Run Code Online (Sandbox Code Playgroud)
该readAsBytesSync()
方法在 Android 上运行良好,但在 iOS 中速度太慢。那么如何将此代码移动到新的后台线程?
1. 使用未来
您可以使用异步版本的readAsBytes
.
所以而不是:
final imageData = _image.readAsBytesSync();
_base64 = base64.encode(imageData);
Run Code Online (Sandbox Code Playgroud)
你可以有:
final imageData = await _image.readAsBytes();
_base64 = base64.encode(imageData);
Run Code Online (Sandbox Code Playgroud)
2. 使用隔离
在您的代码中,不一定是readAsBytes
速度慢的行。它可能是图像的 Base 64 编码。如果是这种情况,您可以将整个计算放入单独的隔离区中。您可以使用一种方便的计算方法。
// This needs to be a global function
encodeImage(File imageFile) {
return base64.encodeimageFile.readAsBytesSync());
}
Run Code Online (Sandbox Code Playgroud)
Future setPrefs() async {
_base64 = await compute(encodeImage, _image);
print(_base64);
final prefs = await SharedPreferences.getInstance();
prefs.setString(IMAGE_KEY, _base64);
}
Run Code Online (Sandbox Code Playgroud)
另外,值得一提的是SharedPreferences
(对于Android,又名NSUserDefaults
iOS)旨在存储小型用户设置。它不是为存储图像而设计的,图像可能有兆字节大。最好将图像文件复制到应用程序的文档文件夹中,并仅将文件名存储在SharedPreferences
.
归档时间: |
|
查看次数: |
6335 次 |
最近记录: |