3 回答

TA贡献1876条经验 获得超5个赞
达特中没有这样的功能。为了实现接口,您必须声明一个类。
替代方法是定义 API 以接受单个函数而不是单个对象,或者声明一个帮助器类,该类将必要方法的行为作为构造函数参数。
例:
class _UserSignupInterface extends _SignupSelectUsernamePageState
implements UserSignupInterface {
void Function(_UserSingupInterface self) _onSuccess;
void Function(_UserSingupInterface self) _onError;
_UserSignupInterface(this._onSuccess, this._onError);
@override
void onSuccess() {
_onSuccess(this);
}
@override
void onError() {
_onError(this);
}
}
然后,您可以将其称为:
... _UserSignupInterface((self) {
self._navigateToUserPage();
}, (self) {
self.setState(() {
self._isSignupClickable = true;
});
})
诚然,它不像Java那么漂亮。

TA贡献1858条经验 获得超8个赞
我知道这个问题已经有了答案,但我想添加一个更整洁的实现,接近我通常使用。Java inline interface
首先,我们有一个类,它充当我们的接口:
class HttpRequestCallback {
/// Called when http request is completed
final void Function() onCompleted;
/// Called when http request is successful
/// * [message] is a dynamic object returned by the http server response
final void Function(dynamic message) onSuccess;
/// Called when http request fail
/// * [message] is a dynamic object returned by the http server response
final void Function(dynamic message) onError;
HttpRequestCallback(
{required this.onCompleted,
required this.onSuccess,
required this.onError});
}
其次,我们有一个函数,期望接口作为参数:
Future<void> login(LoginModel model, {HttpRequestCallback? callback}) async {
var response = await httpClient.doPost(app_constants.ApiEndpoints.Login,
body: model.toJson());
// Api request completed
callback?.onCompleted();
if (response.success) {
// Api request successful
callback?.onSuccess(LoginResponseModel.fromJson(
response.message as Map<String, dynamic>));
} else {
// Api request failed
callback?.onError(response.message);
}
}
最后,我们调用传递接口的函数作为参数:
...
apiService.login(loginModel,
callback: HttpRequestCallback(
onCompleted: () {
//...
},
onSuccess: (message) {
//...
},
onError: (message) {
//...
}
));
...

TA贡献1772条经验 获得超8个赞
我认为您正在Dart中寻找匿名类,但它不受支持。
如果我很好地理解了你想要做什么,你可以通过这种方式将函数作为参数传递来实现类似的事情:
enum ResultLogin { OK, ERROR }
class Login {
Function _listener; // generic function
Login(listener) {
_listener = listener;
}
void run(){
ResultLogin result = *DO_YOUR_LOGIN_FUNCTION*;
_listener(result);
}
}
class Main {
void doLogin(){
Login myLogin = new Login((ResultLogin result){
switch(result){
case OK:
print("OK");
break;
case ERROR:
print("ERROR");
break;
default:
break;
}
}
);
}
}
通过这种方式,您可以根据需要处理结果并刷新一些小部件状态。
添加回答
举报