簡體   English   中英

'(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]));
  }

那么我應該如何在閉包中傳遞回調呢?

實際問題是您的類型定義。 您期望在函數返回void (無)時返回VoidCallback

改變:

VoidCallback onFailed(BuildContext context, Exception exception)

void onFailed(BuildContext context, Exception exception)

或者

void Function(BuildContext,Exception) onFailed

onSuccess也是如此。

希望有幫助!

麥克風,

您聲明的參數存在問題:

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM