![](/img/trans.png)
[英]Another exception was thrown: type '(BuildContext, int) => dynamic' is not a subtype of type '(BuildContext, int) => Widget'
[英]'(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.