代码之家  ›  专栏  ›  技术社区  ›  Daibaku

颤振计算方法

  •  1
  • Daibaku  · 技术社区  · 7 年前

    我正试图通过 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;
        });
      }
    
    1 回复  |  直到 7 年前
        1
  •  16
  •   CopsOnRoad    7 年前

    根据 https://docs.flutter.io/flutter/foundation/compute.html ,

    回调参数必须是顶级函数,而不是闭包或类的实例或静态方法。

    请移除 static 关键字,应该可以

        2
  •  3
  •   Suragch Shmidt    6 年前

    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

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