将带参数的函数传递给VoidCallback

时间:2018-04-29 10:50:21

标签: dart flutter

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

例如:

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final VoidCallback callback(int);

  MyOtherClass(this.callback);

  callback(5);
}

8 个答案:

答案 0 :(得分:24)

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

效果完全相同,它只允许你为函数类型使用一个较短的名称,但只有你经常使用它才真正有意义。

答案 1 :(得分:6)

创建自己的回调

typedef void MyCallback(int foo);

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final MyCallback callback;

  MyOtherClass(this.callback);

}

答案 2 :(得分:4)

Flutter已经有了一个typedef:ValueSetter

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

答案 3 :(得分:4)

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

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

  MyOtherClass myOtherClass = MyOtherClass(doSomething);
}

class MyOtherClass {
  final ValueChanged<int> callback;

  MyOtherClass(this.callback);
}

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

callback(10);

答案 4 :(得分:3)

只需将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);
}

答案 5 :(得分:1)

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

答案 6 :(得分:0)

用户界面情况下的示例。您可能需要创建小部件并传递点击功能。

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。将小部件实现到这样的三个视图并传递功能

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

答案 7 :(得分:0)

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

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