将带参数的函数传递给VoidCallback

Tob*_*ubo 19 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);
}
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 41

宣言VoidCallback

typedef void VoidCallback();
Run Code Online (Sandbox Code Playgroud)

这是可以使用零参数调用并且不返回有用值的函数类型.这似乎不是你想要的.由于程序在语法上没有效果,所以你想要的并不完全清楚,但这对你有用:

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); }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们将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); }
}
Run Code Online (Sandbox Code Playgroud)

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


Fra*_*ela 17

只需将 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);
}
Run Code Online (Sandbox Code Playgroud)


Rém*_*let 15

创建自己的回调

typedef void MyCallback(int foo);

class MyClass {
  void doSomething(int i){

  }

  MyOtherClass myOtherClass = new MyOtherClass(doSomething);
}


class MyOtherClass {
  final MyCallback callback;

  MyOtherClass(this.callback);

}
Run Code Online (Sandbox Code Playgroud)


Jac*_*per 8

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,
      ),
    ),
  );
Run Code Online (Sandbox Code Playgroud)

2.像这样实现小部件到三个视图的传递功能

_cardButton(
    onClickAction: () => {debugPrint("CLICKED")},
),
Run Code Online (Sandbox Code Playgroud)

  • 这就是我一直在寻找的东西。所以谢谢! (2认同)

Cop*_*oad 8

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

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

  MyOtherClass myOtherClass = MyOtherClass(doSomething);
}

class MyOtherClass {
  final ValueChanged<int> callback;

  MyOtherClass(this.callback);
}
Run Code Online (Sandbox Code Playgroud)

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

callback(10);
Run Code Online (Sandbox Code Playgroud)


Kal*_*dla 8

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

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"),
  ),
);
}
}
Run Code Online (Sandbox Code Playgroud)

现在要在屏幕中使用它,请考虑一个代码片段。

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
  },
);
}
}
Run Code Online (Sandbox Code Playgroud)


Dun*_*nes 5

扑已经为这一个typedef: ValueSetter

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


Ani*_*mar 5

1)首先在任何常量类中创建 typedef:

typedef StringVoidFunc = void Function(String);
Run Code Online (Sandbox Code Playgroud)

2) 从调用函数类一传递

showAlertDialog(doSomething);
Run Code Online (Sandbox Code Playgroud)

3)回调句柄函数

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

});
Run Code Online (Sandbox Code Playgroud)

}

4) 从您想要从第二类回电的地方

    showAlertDialog(StringVoidFunc callback) {
     callback("delete");
}
Run Code Online (Sandbox Code Playgroud)