将带参数的函数传递给 VoidCallback
Posted
技术标签:
【中文标题】将带参数的函数传递给 VoidCallback【英文标题】:Pass a function with parameters to a VoidCallback 【发布时间】:2018-10-09 16:15:23 【问题描述】:是否可以?
例如这样的:
class MyClass
void doSomething(int i)
MyOtherClass myOtherClass = new MyOtherClass(doSomething);
class MyOtherClass
final VoidCallback callback(int);
MyOtherClass(this.callback);
callback(5);
【问题讨论】:
更高级的函数可以是接受 2 个字符串并返回 intfinal int Function(String, String) callback
【参考方案1】:
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);
在这里,我们将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);
效果完全一样,只是允许你为函数类型使用更短的名称,但只有在你经常使用它的情况下才真正有意义。
【讨论】:
【参考方案2】:改为创建您自己的回调
typedef void MyCallback(int foo);
class MyClass
void doSomething(int i)
MyOtherClass myOtherClass = new MyOtherClass(doSomething);
class MyOtherClass
final MyCallback callback;
MyOtherClass(this.callback);
【讨论】:
【参考方案3】:UI 案例中的示例;您可能需要创建小部件并传递点击功能。
第一步:在构造函数中创建以函数为参数的小部件:
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,
),
),
);
第二步:实现widget到三视图,传递函数如下:
_cardButton(
onClickAction: () => debugPrint("CLICKED"),
),
【讨论】:
这是我要找的。所以谢谢你!【参考方案4】:Flutter 已经为此提供了 typedef:ValueSetter
。
因此您可以将ValueSetter<int>
的实例传递给您的其他类。
【讨论】:
如何做多个参数?像 int 和 String 一样吗? @JeffreyLiu 您可以创建一个类型来保存这些值。然后使用ValueSetter<YourTypeHere>
。【参考方案5】:
你可以用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);
【讨论】:
【参考方案6】:只需将 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);
【讨论】:
【参考方案7】:1) 首先在任何常量类中创建 typedef:
typedef StringVoidFunc = void Function(String);
2) 从调用函数类一传递
showAlertDialog(doSomething);
3) 回调句柄函数
void doSomething(String i)
Navigator.pop(context);
setState(()
);
4) 你想从哪里触发第二类的回调
showAlertDialog(StringVoidFunc callback)
callback("delete");
【讨论】:
【参考方案8】:简单的方法是创建一个无状态或有状态的小部件并将回调函数传递给它。考虑如下代码 sn-p:
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"),
),
);
现在要在屏幕中使用它,请考虑使用代码 sn-p。
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
,
);
【讨论】:
以上是关于将带参数的函数传递给 VoidCallback的主要内容,如果未能解决你的问题,请参考以下文章
通过 TeamCity 将带引号的参数传递给 PowerShell 脚本
带有参数的JavaScript addEventListener函数[重复]
如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数