将带参数的函数传递给 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 个字符串并返回 int final 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将带参数的函数传递给Angular中的内部组件

通过 TeamCity 将带引号的参数传递给 PowerShell 脚本

带有参数的JavaScript addEventListener函数[重复]

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

将参数传递给函数

将数组中的所有值作为参数传递给函数