颤振计算方法

时间:2018-09-06 04:34:16

标签: dart flutter

我正在尝试通过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;
    });
  }

2 个答案:

答案 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被阻止了。

enter image description here

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;
}