【问题标题】:Flutter- compute methodFlutter-计算方法
【发布时间】:2021-06-01 21:47:53
【问题描述】:

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

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    根据https://api.flutter.dev/flutter/foundation/compute-constant.html

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

    请删除static 关键字,它应该可以正常工作

    【讨论】:

      【解决方案2】:

      这是一个计算示例:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 2018-02-18
        • 2019-03-29
        • 2015-07-30
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多