【问题标题】:Future Function passed as parameter not executing Flutter作为参数传递的未来函数不执行 Flutter
【发布时间】:2022-01-05 18:54:15
【问题描述】:

我正在尝试从自定义小部件创建小部件,因此当我将参数传递给创建小部件的函数时,我需要设置 onPressed 函数,但按下它时不起作用。

A类:

final Future Function(BuildContext context, Key newKey, String title) myFunction = _functionToPass;
setState(() {
    _widgetList.add(_MyCustomWidget.createCustomWidget(_title, _isChecked, myFunction));
  });//This works, the widget appears on my screen.

  Future _functionToPass(BuildContext context, Key newKey, String taskTitle) =>
  showDialog(......);  
  

B类:

class MyCustomWidget {
  StatefulBuilder createCustomWidget(title, isChecked, myFunction) {
    return StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
          return ListTile(
            title: Text(title),
            leading: Checkbox(
              value: isChecked,
              onChanged: (bool? newValue) {
                setState(() {
                  isChecked = newValue!;
                });
              },
            ),
            trailing: TextButton(
              child: Icon(Icons.edit),
              onPressed: () async {
                print("Hi"); //This is printing correctly
                await myFunction; //the function is not calling
              },
            ),
          );
        });
  }
}

【问题讨论】:

    标签: flutter parameter-passing future


    【解决方案1】:

    解决方案

    你需要通过添加括号来调用你的函数,并传递所需的参数:

    onPressed: () async {
      print("Hi");
      await myFunction(param1, param2...);   //Change this line
    },
    

    重现问题的示例:

    尝试在dartpad.dev 上运行以下代码,带括号和不带括号:

    void main() async {
      final Future Function(String title) myFunction = (String title) async{print(title);};
      print("Hi");
      await myFunction("a");
    }
    

    另外,正如 cmets 中所讨论的,在方法句柄上使用参数指定预期的函数是一个很好的做法,而不是 os 只是命名参数,添加类型,如下所示:

    StatefulBuilder createCustomWidget(title, isChecked, Future Function(BuildContext, Key, String) myFunction)
    

    所以当你传递错误的参数时,Dart 知道它是错误的并警告你:

    【讨论】:

    • 感谢它起作用了,我没有尝试使用 (),因为我发现的解决方案就像我尝试不使用 () 的解决方案,所以当函数有参数时,它会使用 () 和否则没有()?
    • 另外,函数被调用是因为对话框显示但没有更新状态。你知道如何更新状态吗?我认为使用 StatefulBuilder() 但类 A 没有得到更新。 @乔治
    • 我相信无论如何你都需要空括号,但你需要添加你的函数所需的参数。如果您想查看错误,通常最好在参数上指定函数类型。您可以使用StatefulBuilder createCustomWidget(title, isChecked, Function(String) myFunction) {,而不仅仅是写StatefulBuilder createCustomWidget(title, isChecked, myFunction) {。所以你在编译时会出错。我将在我的答案中添加详细信息
    猜你喜欢
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    相关资源
    最近更新 更多