【问题标题】:Pass a function with parameters to a VoidCallback将带参数的函数传递给 VoidCallback
【发布时间】:2018-10-09 16:15:23
【问题描述】:

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

例如这样的:

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

标签: dart flutter


【解决方案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
              },
            );
            }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-06-29
              • 2019-03-29
              • 1970-01-01
              • 2013-01-27
              • 2014-01-06
              • 2015-08-29
              • 2011-03-11
              • 1970-01-01
              相关资源
              最近更新 更多