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

时间:2020-03-31 09:58:49

标签: flutter dart closures

我有一个凸起的按钮,该按钮有一个闭合的按钮,可以在我的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]));
  }

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

2 个答案:

答案 0 :(得分:2)

实际的问题是您的类型定义。您期望函数返回VoidCallback时返回void(什么都没有)。

更改:

VoidCallback onFailed(BuildContext context, Exception exception)

void onFailed(BuildContext context, Exception exception)

void Function(BuildContext,Exception) onFailed

onSuccess上也是如此。

希望有帮助!

答案 1 :(得分:0)

迈克

您要声明的参数存在问题:

 VoidCallback onFailed(BuildContext context, Exception exception)

表示它是传递函数时返回类型为 VoidCallback 的函数:

void _onRegistrationFailed(BuildContext context, Exception exception)

其返回类型为 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