'(BuildContext, Exception) => void' 不是类型 '(BuildContext, Exception) => () => void' 的子类型

'(BuildContext, Exception) => void' is not a subtype of type '(BuildContext, Exception) => () => void'

我有一个凸起的按钮,它有一个闭包,它在我的 AuthenticationProvider

中执行一个函数
RaisedButton(
  textColor: Theme.of(context).backgroundColor,
  onPressed: () => authenticationProvider.registerWithPhone(context, _phoneNumber, onFailed: _onRegistrationFailed),
  child: Text('Send'),
)

它传递了一个在同一个小部件中定义的回调函数

  void _onRegistrationFailed(BuildContext context, Exception exception)
  {
    showDialog(
      context: context,
      builder: (context) {
        return PlatformAlertDialog('test', 'test', 'test');
    });
  }

但是我得到以下错误'(BuildContext, Exception) => void' is not a subtype of type '(BuildContext, Exception) => () => void'

这是凸起按钮调用的函数

  Future<void> registerWithPhone(BuildContext context, PhoneNumberModel phoneNumber,
      {VoidCallback onSuccess(BuildContext context), VoidCallback onFailed(BuildContext context, Exception exception)}) async {
    _status = AuthenticationStatus.Authenticating;
    notifyListeners();
    String localizedPhoneNumber = phoneNumber.toString();

    return await _authentication.verifyPhoneNumber(
        phoneNumber: localizedPhoneNumber,
        timeout: Duration(seconds: _phoneVerificationTimeout),
        verificationCompleted: (authCredential) => _verificationComplete(context, authCredential, onSuccess: onSuccess),
        verificationFailed: (authException) => _verificationFailed(context, authException, onFailed: onFailed),
        codeAutoRetrievalTimeout: (verificationId) => _codeAutoRetrievalTimeout(verificationId),
        codeSent: (verificationId, [code]) => _smsCodeSent(verificationId, [code]));
  }

那么我应该如何在闭包中传递回调?

实际问题是您的类型定义。您期望 VoidCallback 在函数 returns 返回 void(无)时返回。

变化:

VoidCallback onFailed(BuildContext context, Exception exception)

void onFailed(BuildContext context, Exception exception)

void Function(BuildContext,Exception) onFailed

onSuccess 也一样。

希望对您有所帮助!

迈克,

您声明的参数有问题:

 VoidCallback onFailed(BuildContext context, Exception exception)

表示它是一个return类型的函数VoidCallback,而你正在传递函数:

void _onRegistrationFailed(BuildContext context, Exception exception)

其中有 return 类型 void

要修复错误,您应该像这样重写您的函数:

Future<void> registerWithPhone(BuildContext context, PhoneNumberModel phoneNumber,
      {void onSuccess(BuildContext context), void onFailed(BuildContext context, Exception exception)}) async {
    _status = AuthenticationStatus.Authenticating;
    notifyListeners();
    String localizedPhoneNumber = phoneNumber.toString();

    return await _authentication.verifyPhoneNumber(
        phoneNumber: localizedPhoneNumber,
        timeout: Duration(seconds: _phoneVerificationTimeout),
        verificationCompleted: (authCredential) => _verificationComplete(context, authCredential, onSuccess: onSuccess),
        verificationFailed: (authException) => _verificationFailed(context, authException, onFailed: onFailed),
        codeAutoRetrievalTimeout: (verificationId) => _codeAutoRetrievalTimeout(verificationId),
        codeSent: (verificationId, [code]) => _smsCodeSent(verificationId, [code]));
  }

请注意,同样适用于 onSuccess 参数。

我还建议考虑使用函数类型别名:https://dart.dev/guides/language/language-tour#typedefs