如何在达特/颤音中实现内联接口而不是使用类?

有没有办法在飞镖/颤动中实现接口而不必使用类?


目前,我如何实现它与下面的代码


class _UserSignupInterface extends _SignupSelectUsernamePageState

    implements UserSignupInterface {

  @override

  void onSuccess() {

    _navigateToUserPage();

  }


  @override

  void onError() {

    setState(() {

      _isSignupClickable = true;

    });

  }

}


_attemptSignup() {

  UserSingleton userSingletonInstance = UserSingleton().getInstance();

  UserSignupInterface _userSignupInterface = _UserSignupInterface();


  UserSingleton().getInstance().user.username = _username;


  UserLoginController.attemptSignup(_userSignupInterface,

      userSingletonInstance.user, userSingletonInstance.userDetail, _groupID);

}

但是,我想实现这些接口方法,而不必使用类,就像我在java中一样。类似于下面的代码。


UserController.attemptSignup(context, new UserSignupRequest() {

            @Override

            public void onSuccess(User user, UserDetail userDetail, Group group) {

                btnContinueWithFacebook.setEnabled(true);

                Intent intent = new Intent(context, ScoopActivity.class);

                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);


                progressBar.setVisibility(View.GONE);

                startActivity(intent);

            }


            @Override

            public void onFail() {

                Log.d(APP.TAG, "Signup request has failed");

                btnContinueWithFacebook.setEnabled(true);

                progressBar.setVisibility(View.GONE);

                /**

                 * TODO:: Notify user of signup attempt failure

                 */

            }

        }, user, userDetail, group_id);


哈士奇WWW
浏览 134回答 3
3回答

慕运维8079593

达特中没有这样的功能。为了实现接口,您必须声明一个类。替代方法是定义 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那么漂亮。

猛跑小猪

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

料青山看我应如是

我认为您正在Dart中寻找匿名类,但它不受支持。如果我很好地理解了你想要做什么,你可以通过这种方式将函数作为参数传递来实现类似的事情:enum ResultLogin { OK, ERROR }class Login {&nbsp; &nbsp;Function _listener; // generic function&nbsp; &nbsp;Login(listener) {&nbsp; &nbsp; &nbsp; _listener = listener;&nbsp; &nbsp;}&nbsp; &nbsp;void run(){&nbsp; &nbsp; &nbsp; ResultLogin result = *DO_YOUR_LOGIN_FUNCTION*;&nbsp; &nbsp; &nbsp; _listener(result);&nbsp; &nbsp;}}&nbsp; &nbsp;class Main {&nbsp; &nbsp; void doLogin(){&nbsp; &nbsp; &nbsp; &nbsp; Login myLogin = new Login((ResultLogin result){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch(result){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case OK:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("OK");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case ERROR:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("ERROR");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; }}通过这种方式,您可以根据需要处理结果并刷新一些小部件状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java