Pass a function with parameters to a VoidCallback

是否可以将带参数的函数传递给 VoidCallback?

比如像这样的东西:

class MyClass {
void doSomething(int i){


}


MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}




class MyOtherClass {
final VoidCallback callback(int);


MyOtherClass(this.callback);


callback(5);
}
172455 次浏览

VoidCallback的声明如下

typedef void VoidCallback();

这种类型的函数可以用零参数调用,但不返回有用的值。这似乎不是你想要的。 It's not entirely clear what you do want since the program isn't syntactically valid, but would this work for you:

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

在这里,我们将 callback字段的类型定义为可以用一个整数参数调用的函数类型,该函数不返回任何有用的值。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);


}

Flutter 已经为此设置了 typedef: ValueSetter

因此可以将 ValueSetter<int>的实例传递给其他类。

例如在 UI 案例中; 您可能需要创建小部件和传递单击函数。

Step 1: create widget with function as parameter in constructor:

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: 实现三视图的小部件,并像下面这样传递函数:

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

你可以使用 ValueChanged<T>代替 VoidCallback,下面是一个例子:

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


MyOtherClass myOtherClass = MyOtherClass(doSomething);
}


class MyOtherClass {
final ValueChanged<int> callback;


MyOtherClass(this.callback);
}

然后可以使用任何 int值调用 callback

callback(10);

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 替换为 Function (int)

class MyClass {
void doSomething(int i){


}


MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}




class MyOtherClass {
//OP code (does not work): final VoidCallback callback(int);
final Function(int) callback;


MyOtherClass(this.callback);


callback(5);
}

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

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

我使用的方法:

1-用 typedef 声明:

typedef MyFunction = void Function(int);


class MyClass {
final MyFunction myFunction;
    

void onBunttonPressed() {
//using function
myFunction(1);
}
}

2-直接变量:

class MyClass {
final void Function(int) myFunction;
        

void onBunttonPressed() {
//using function
myFunction(1);
}
}
 // We can pass function  like this too....
class A
{
void showMessage(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message),
duration: const Duration(seconds: 2),
action: SnackBarAction(
textColor: Colors.blue,
label: 'OKAY',
onPressed: () {},
),
),
);
}
// calling another class and passing function
EditPage(
showMessage: (String message) {
showMessage(context, message);
},
)
}
class EditPage{
final Function showMessage;
EditPage({required this.showMessage})


}
// we can call by
widget.showMessage(context,'message value');