flutter 将回调方法作为参数发送

tp5buhyn  于 2023-02-25  发布在  Flutter
关注(0)|答案(2)|浏览(254)

我有一个Dart类,其中有一个用于显示警报的helper方法。警报在应用上显示多次,但警报上的onPressed()在不同的位置执行不同的操作。我想将我希望onPressed()执行的操作作为参数发送。
下面是我的helper方法:

basicAlertWithOkWithCallback(String message, BuildContext context, void Function() f){

  showDialog(
    context: context,
    builder: (context) =>
        AlertDialog(
          content: Text(message),
          actions: <Widget>[
            TextButton(
              child: const Text('OK'),
              onPressed: () async {
                f;
              },
            ),
          ],
        ),
  );
}

我从另一个屏幕调用该方法,如下所示:
basicAlertWithOkWithCallback('会话成功保存。',上下文,回调(上下文));
在那个屏幕上我做了这个方法,我想在按OK键的时候执行它:

callBack(BuildContext context){
  print('CALLED');
  Navigator.of(context).pop();
  Navigator.of(context).pop();
  Navigator.of(context).pop();
}

问题是,当警报显示时,甚至在用户按OK之前,这个方法就被直接调用了。为什么它被直接调用,而不是在onPressed()上调用呢?

1l5u6lss

1l5u6lss1#

调用basicAlertWithOkWithCallback时立即调用callBack方法的原因是,您调用的是callBack方法并将其返回值作为参数传递给basicAlertWithOkWithCallback方法,而不是传递callBack方法本身。
要解决此问题,您需要将callBack方法作为参数传递给basicAlertWithOkWithCallback方法,如下所示:

basicAlertWithOkWithCallback('Session successfully saved.', context, callBack);

请注意,在上面的代码中,我们没有使用()调用callBack方法,而是传递了一个对callBack方法的引用,这样当用户按下“OK”按钮时,它就可以被调用。
此外,您需要在onPressed回调中调用f函数,方法是在f参数后面添加(),如下所示:

onPressed: () async 
{
  f();
},

通过这样做,callBack方法将仅在用户按下“OK”按钮时调用。

w6lpcovy

w6lpcovy2#

class SomeWidget extends StatelessWidget {
  const SomeWidget({Key? key, required this.ontap}) : super(key: key);

  final VoidCallback ontap;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: ontap,
      child: Container(),
    );
  }
}

// call it like this
SomeWidget(ontap: (){})

相关问题