dart 向Flutter中的compute函数发送多个参数

g52tjvyc  于 2023-01-22  发布在  Flutter
关注(0)|答案(6)|浏览(328)

我试着在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是SudokuAlgorithm类的静态方法。它存在于另一个文件中。编写上面的代码,告诉我
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)
我该如何修正这个问题?可以在不把SudokuAlgorithm类的方法从文件中取出的情况下完成吗?如何发送多个参数到compute函数?
static bool isBoardInSudoku(List<List<int>>board , int size ){ }是我的isBoardInSudoku函数。

u5rb5r59

u5rb5r591#

只需将参数放在Map中并传递它即可。
没有办法向compute传递多个参数,因为它是启动隔离的方便函数,也不允许任何东西,但只有一个参数。

du7egjpx

du7egjpx2#

使用Map。下面是一个示例:

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'];
   ...
}
tcomlyy6

tcomlyy63#

在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)) ;
093gszye

093gszye4#

使用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());
  }
aiazj4mn

aiazj4mn5#

你可以有一个只有一个Map参数的函数,这样你就可以通过传递一个带有属性和值的Map来传递多个参数。但是,我现在遇到的问题是我不能传递函数。如果一个Map的属性值是一个函数,我在运行计算函数时会得到一个错误。
这个例子是有效的(请记住我已经导入了库,这就是为什么一些函数和类定义没有出现在这个例子中的原因)

Future<List<int>> getPotentialKeys({
  @required int p,
  @required int q,
})async{
  return await compute(allKeys,{
    "p" : p,
    "q" : q,
  });
}

List<int> allKeys(Map<String,dynamic> parameters){
  AdvancedCipherGen key = AdvancedCipherGen();
  List<int> possibleE = key.step1(p: parameters["p"], q: parameters["q"]);
  return possibleE;
}

这是不起作用的(同样的事情与一个属性的值thows一个错误的函数)

Future<List<int>> getPotentialKeys({
  @required int p,
  @required int q,
  @required Function(AdvancedCipherGen key) updateKey,
})async{
  return await compute(allKeys,{
    "p" : p,
    "q" : q,
    "updateKey" : updateKey,
  });
}

List<int> allKeys(Map<String,dynamic> parameters){
  AdvancedCipherGen key = AdvancedCipherGen();
  List<int> possibleE = key.step1(p: parameters["p"], q: parameters["q"]);
  //TODO: Update the key value through callback
  parameters["updateKey"](key);
  return possibleE;
}
esbemjvw

esbemjvw6#

使用类很容易,也可以使用Map或列表,但使用类更好,更干净

class MyFunctionInput{
  final int first;
  final int second;
  MyFunctionInput({required this.first,required this.second});
}

像这样改变你的函数

doSomething(MyFunctionInput input){
  
}

并像下面这样使用它

compute(doSomething,MyFunctionInput(first: 1, second: 4));

相关问题