Flutter:如何在 dart 的后台线程上运行函数

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 中速度太慢。那么如何将此代码移动到新的后台线程?

Yuc*_*ong 5

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,又名NSUserDefaultsiOS)旨在存储小型用户设置。它不是为存储图像而设计的,图像可能有兆字节大。最好将图像文件复制到应用程序的文档文件夹中,并仅将文件名存储在SharedPreferences.