'(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
我有一个凸起的按钮,它有一个闭包,它在我的 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