如何正确构造以下代码?我启动了一个昂贵的异步操作。 “runExpensiveOperation”方法会停止旋转的 CircularProgressIndicator,因此它似乎是在主线程上执行的。在原生 iOS 上有没有类似“dispatch_async”的东西?
class _MyHomePageState extends State<MyHomePage> {
void _pressed() async {
print("I am pressed");
print("I will make a cheap operation now");
await runExpensiveOperation();
}
Future<void> runExpensiveOperation() async {
print('starting expensive operation');
for (var i = 0; i<1000000; i++) {
List<int> bytes = utf8.encode('somethingtohash');
String hash = sha256.convert(bytes).toString();
}
print('finished expensive operation');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(),
FlatButton(
child: Text("Press me for tough operation"),
onPressed: _pressed,
)
],
),
),
);
}
}
最佳答案
class _MyHomePageState extends State<MyHomePage> {
void _pressed() async {
print("I am pressed");
print("I will make a cheap operation now");
// string returned is "Good Morning"
String string = await compute(runExpensiveOperation, null); // this is what you need
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(),
FlatButton(
child: Text("Press me for tough operation"),
onPressed: _pressed,
)
],
),
),
);
}
}
// make sure this is outside your class definition
Future<String> runExpensiveOperation(void _) async {
print('starting expensive operation');
for (var i = 0; i<1000000; i++) {
List<int> bytes = utf8.encode('somethingtohash');
String hash = sha256.convert(bytes).toString();
}
print('finished expensive operation');
return "Good Morning";
}
关于user-interface - Flutter UI 在异步操作上挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56758816/