为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哈士奇WWW 2022-09-14 15:19:33
有没有办法在飞镖/颤动中实现接口而不必使用类?目前,我如何实现它与下面的代码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);
查看完整描述

3 回答

?
慕运维8079593

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那么漂亮。


查看完整回答
反对 回复 2022-09-14
?
猛跑小猪

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) {

        //...

       }

    ));

...


查看完整回答
反对 回复 2022-09-14
?
料青山看我应如是

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;

                }

            }

        );


    }

}

通过这种方式,您可以根据需要处理结果并刷新一些小部件状态。


查看完整回答
反对 回复 2022-09-14
  • 3 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号