我正在尝试通过compute()
执行繁重的方法。
我这样尝试过。
执行loop
之后,Text
小部件将更新,但是result
几乎在按下按钮后立即返回0。
有人知道我在想什么吗?
int _counter;
static int loop(int val) {
int count = 0;
for (int i = 1; i <= val; i++) {
count += i;
}
return count;
}
Future<void> _onPressed() async {
int result = await compute(loop, 1000000000000000000);
setState(() {
_counter = result;
});
}
答案 0 :(得分:4)
根据https://docs.flutter.io/flutter/foundation/compute.html,
回调参数必须是顶级函数,而不是类的闭包,实例或静态方法。
请删除static
关键字,它应该可以正常工作
答案 1 :(得分:3)
这是一个计算示例:
final sum = await compute(computationallyExpensiveTask, 1000000000);
这是在计算隔离中运行的功能:
int computationallyExpensiveTask(int value) {
var sum = 0;
for (var i = 0; i <= value; i++) {
sum += i;
}
print('finished');
return sum;
}
compute
的函数必须是顶级函数(不在类内部)。这是上下文中的完整代码。循环进度指示器停止旋转,因为直接执行computationallyExpensiveTask
时UI被阻止了。
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: BodyWidget(),
),
);
}
}
class BodyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
CircularProgressIndicator(),
RaisedButton(
child: Text('start'),
onPressed: () async {
final sum = computationallyExpensiveTask(1000000000);
//final sum = await compute(computationallyExpensiveTask, 1000000000);
print(sum);
},
)
],
),
);
}
}
int computationallyExpensiveTask(int value) {
var sum = 0;
for (var i = 0; i <= value; i++) {
sum += i;
}
print('finished');
return sum;
}