Dart 将带参数的函数传递给回调函数

Dart 将带参数的函数传递给回调函数,dart,flutter,Dart,Flutter,是否可以将带有参数的函数传递给回调函数 例如,类似这样的事情: class MyClass { void doSomething(int i){ } MyOtherClass myOtherClass = new MyOtherClass(doSomething); } class MyOtherClass { final VoidCallback callback(int); MyOtherClass(this.callback); callback(5);

是否可以将带有参数的函数传递给回调函数

例如,类似这样的事情:

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final VoidCallback callback(int);

  MyOtherClass(this.callback);

  callback(5);
}
_cardButton(
    onClickAction: () => {debugPrint("CLICKED")},
),

VoidCallback
的声明为

typedef void VoidCallback();
这是一种可以用零参数调用且不返回有用值的函数类型。那似乎不是你想要的。 由于程序在语法上是无效的,所以不完全清楚您想要什么,但这对您有用吗:

class MyClass { 
  static doSomething(int i) { /* ... */ }
  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}
class MyOtherClass {
  final void Function(int) callback;
  MyOtherClass(this.callback);
  void callCallaback() { callback(5); }
}
这里我们将
回调
字段的类型定义为可以使用一个整型参数调用且不返回有用值的函数类型。
doSomething
方法具有该类型,因此可以将其分配给
callback

您还可以使用typedef来命名函数:

typedef Int2VoidFunc = void Function(int);
// or: typedef void Int2VoidFunc(int arg);
class MyOtherClass {
  final Int2VoidFunc callback;
  MyOtherClass(this.callback);
  void callCallaback() { callback(5); }
}

效果完全相同,它只允许您对函数类型使用较短的名称,但这只有在您经常使用它时才有意义。

创建您自己的回调

typedef void MyCallback(int foo);

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final MyCallback callback;

  MyOtherClass(this.callback);

}

颤振已具有此的typedef:


因此,您可以将
ValueSetter
的实例传递给其他类。

UI案例中的示例;您可能需要创建小部件并传递单击功能

步骤1:创建小部件,将函数作为构造函数中的参数:

Container _cardButton({
  Function onClickAction,
}) {
  return Container(
    width: 340,
    height: 90,
    child: InkWell(
      splashColor: Colors.blue.withAlpha(30),
      onTap: () {
        onClickAction();
      },
      child: Card(
        elevation: 5,
        child: somechild,
      ),
    ),
  );
步骤2:将小部件实现为三视图并传递函数,如下所示:

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final VoidCallback callback(int);

  MyOtherClass(this.callback);

  callback(5);
}
_cardButton(
    onClickAction: () => {debugPrint("CLICKED")},
),

您可以使用
ValueChanged
,而不是
VoidCallback
,下面是一个示例:

class MyClass {
  static void doSomething(int i) {}

  MyOtherClass myOtherClass = MyOtherClass(doSomething);
}

class MyOtherClass {
  final ValueChanged<int> callback;

  MyOtherClass(this.callback);
}
1) 在任何常量类中首先创建typedef:

typedef StringVoidFunc = void Function(String);
2) 从调用函数类1传递

showAlertDialog(doSomething);
3) 回调句柄函数

void doSomething(String i){
Navigator.pop(context);
setState(() {

});
}

4) 从你想开火的地方打电话给二班

    showAlertDialog(StringVoidFunc callback) {
     callback("delete");
}

只需将VoidCallback替换为函数(int)


简单的方法是创建一个无状态或有状态的小部件,并将回调函数传递给它。考虑下面的代码片段:

import 'package:flutter/material.dart';

class TestFunctionWidget extends StatelessWidget {
final Function onCallback;
 const TestFunctionWidget({
  Key key,
  this.onCallback,
 }) : super(key: key);

@override
Widget build(BuildContext context) {
return GestureDetector(
  onTap: () {
    this.onCallback();
  },
  child: Container(
    child: Text("Test Call Back"),
  ),
);
}
}

现在在屏幕上使用它考虑一个代码片段。

import 'package:flutter/material.dart';
import 'package:netflix_clone/pages/test_widget.dart';

class TestScreen extends StatefulWidget {
 TestScreen({
 Key key,
 }) : super(key: key);
 @override
_TestScreen1State createState() => _TestScreen1State();
}
class _TestScreen1State extends State<TestScreen> {
@override
Widget build(BuildContext context) {
return TestFunctionWidget(
  onCallback: () {
    // To do
  },
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:netflix_clone/pages/test_widget.dart”;
类TestScreen扩展了StatefulWidget{
测试屏幕({
关键点,
}):super(key:key);
@凌驾
_TestScreen1State createState()=>\u TestScreen1State();
}
类_TestScreen1State扩展状态{
@凌驾
小部件构建(构建上下文){
返回TestFunctionWidget(
onCallback:(){
//做
},
);
}
}

如何处理多个参数?像int和String一样?@JeffreyLiu您可以创建一个类型来保存这些值。然后使用
ValueSetter
。更高级的函数可以是一个接受2个字符串并返回int
final int函数(String,String)回调的函数,这正是我想要的。谢谢你!