3 回答

TA貢獻1876條經驗 獲得超5個贊
達特中沒有這樣的功能。為了實現(xiàn)接口,您必須聲明一個類。
替代方法是定義 API 以接受單個函數(shù)而不是單個對象,或者聲明一個幫助器類,該類將必要方法的行為作為構造函數(shù)參數(shù)。
例:
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個贊
我知道這個問題已經有了答案,但我想添加一個更整潔的實現(xiàn),接近我通常使用。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});
}
其次,我們有一個函數(shù),期望接口作為參數(shù):
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);
}
}
最后,我們調用傳遞接口的函數(shù)作為參數(shù):
...
apiService.login(loginModel,
callback: HttpRequestCallback(
onCompleted: () {
//...
},
onSuccess: (message) {
//...
},
onError: (message) {
//...
}
));
...

TA貢獻1772條經驗 獲得超8個贊
我認為您正在Dart中尋找匿名類,但它不受支持。
如果我很好地理解了你想要做什么,你可以通過這種方式將函數(shù)作為參數(shù)傳遞來實現(xiàn)類似的事情:
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;
}
}
);
}
}
通過這種方式,您可以根據(jù)需要處理結果并刷新一些小部件狀態(tài)。
添加回答
舉報