'(BuildContext, Exception) => void' не является подтипом типа '(BuildContext, Exception) => () => void' - PullRequest
0 голосов
/ 31 марта 2020

У меня есть поднятая кнопка с закрытием, которое выполняет функцию в моем 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 ]

2 голосов
/ 31 марта 2020

Фактическая проблема - ваше определение типа. Вы ожидаете возврата VoidCallback, в то время как функция возвращает void (ничего).

Изменение:

VoidCallback onFailed(BuildContext context, Exception exception)

на

void onFailed(BuildContext context, Exception exception)

или

void Function(BuildContext,Exception) onFailed

То же самое для onSuccess тоже.

Надеюсь, что поможет!

0 голосов
/ 31 марта 2020

Mike,

Существует проблема в параметрах, которые вы объявляете:

 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...