Я работаю над приложением диспетчера паролей во Flutter, одновременно выполняя этот фрагмент кода для своей функции хеширования:
import 'package:encrypt/encrypt.dart' as EncryptLib;
import 'package:pinenacl/key_derivation.dart' as HashLib;
Map<String, String> hash(String masterPass) {
final salt = EncryptLib.IV.fromSecureRandom(16);
final hashedMasterPass = HashLib.PBKDF2
.hmac_sha512(utf8.encode(masterPass), salt.bytes, 100100, 32);
return {
"hashedMasterPass": base64.encode(hashedMasterPass),
"salt": salt.base64,
};
}
Когда я вызываю эту функцию с помощью такой кнопки, как:
TextButton(
child: Text("Hash Password"),
onPressed: () {
print(hash("ThisIsTheMasterPassword"));
})
Анимация нажатия кнопки полностью останавливается, как и остальная часть пользовательского интерфейса, я немного прочитал о Futures и async и придумал следующее, ожидая, что пользовательский интерфейс не зависнет:
Future<Map<String, String>> hash(String masterPass) async {
final salt = EncryptLib.IV.fromSecureRandom(16);
final hashedMasterPass = HashLib.PBKDF2
.hmac_sha512(utf8.encode(masterPass), salt.bytes, 100100, 32);
return {
"hashedMasterPass": base64.encode(hashedMasterPass),
"salt": salt.base64,
};
}
а также...
TextButton(
child: Text("Hash Password"),
onPressed: () {
hash("ThisIsTheMasterPassword").then((value) {
print(value);
});
})
Те же результаты, пользовательский интерфейс все еще зависает, как и раньше, есть ли способ заставить этот конкретный код не замораживать пользовательский интерфейс?





Можно попробовать использовать изолирует (аналог потоков в Dart).
Вместо этого
TextButton(
child: Text("Hash Password"),
onPressed: () {
hash("ThisIsTheMasterPassword").then((value) {
print(value);
});
})
использовать это
TextButton(
child: Text("Hash Password"),
onPressed: () async{
hash("ThisIsTheMasterPassword").then((value) {
print(value);
});
})
или же
TextButton(
child: Text("Hash Password"),
onPressed: ()async {
var value=await hash("ThisIsTheMasterPassword");
print(value);
})
Вы можете использовать isolate для вычисления sth вне основного потока. https://thewikihow.com/video_qrFTt1NZed8
compute(hash, "ThisIsTheMasterPassword");
Дальнейшее чтение https://flutter.dev/docs/cookbook/networking/background-parsing
Спасибо,
insolateбыл именно тем, что я искал!