Send multiple arguments to the compute function in flutter

时间:2019-01-07 12:55:49

标签: dart flutter

I was trying to use the compute function in flutter.

void _blockPressHandler(int row, int col) async {
//    Called when user clicks any block on the sudoku board . row and col are the corresponding row and col values ;
    setState(() {
      widget.selCol = col;
      }
    });

    bool boardSolvable;
    boardSolvable = await compute(SudokuAlgorithm.isBoardInSudoku , widget.board , widget.size) ;

  }

isBoardInSudoku is a static method of class SudokuAlgorithm. Its present in another file. Writing the above code , tells me that

error: The argument type '(List<List<int>>, int) → bool' can't be assigned to the parameter type '(List<List<int>>) → bool'. (argument_type_not_assignable at [just_sudoku] lib/sudoku/SudokuPage.dart:161)

How do i fix this ? Can it be done without brining the SudokuAlgorithm class's methods out of its file ? How to send multiple arguments to the compute function ?

static bool isBoardInSudoku(List<List<int>>board , int size ){ } is my isBoardInSudoku function.

4 个答案:

答案 0 :(得分:3)

Just put the arguments in a Map and pass that instead.

There is no way to pass more than one argument to compute because it is a convenience function to start isolates which also don't allow anything but a single argument.

答案 1 :(得分:3)

使用地图。这是一个示例:

Map map = Map();
map['val1'] = val1;
map['val2'] = val2;
Future future1 = compute(longOp, map);


Future<double> longOp(map) async {
  var val1 = map['val1'];
  var val2 = map['val2'];
   ...
}

答案 2 :(得分:1)

在 OOP 和一般情况下,为您需要的字段创建一个 class 更为优雅,这为您提供了更大的灵活性,并减少了硬编码字符串或键名常量的麻烦。

例如:

boardSolvable = await compute(SudokuAlgorithm.isBoardInSudoku , widget.board , widget.size) ;

替换为

class BoardSize{
  final int board;
  final int size;
  BoardSize(this.board, this.size);
}

...

boardSolvable = await compute(SudokuAlgorithm.isBoardInSudoku, BoardSize(widget.board, widget.size)) ;

答案 3 :(得分:0)

使用 Tuple

这是我的应用程序中的一些示例代码:

  @override
  Future logChange(
      String recordId, AttributeValue newValue, DateTime dateTime) async {
    await compute(
        logChangeNoCompute, Tuple2<String, AttributeValue>(recordId, newValue));
  }

  Future<void> logChangeNoCompute(Tuple2<String, AttributeValue> tuple) async {
    _recordsById[tuple.item1]!.setAttributeValue(tuple.item2);
    await storage.setItem(AssetsFileName, toJson());
  }