【问题标题】:How to implement interface in-line instead of using a class in Dart/Flutter?如何实现接口内联而不是在 Dart/Flutter 中使用类?
【发布时间】:2019-04-01 04:21:03
【问题描述】:

有什么方法可以在 dart/flutter 中实现接口而不需要使用类?

目前,我如何使用下面的代码来实现它

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

【问题讨论】:

    标签: java interface dart flutter


    【解决方案1】:

    Dart 中没有这样的功能。为了实现一个接口,你必须声明一个类。

    替代方法是定义 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 漂亮。

    【讨论】:

      【解决方案2】:

      我认为您正在寻找 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;
                      }
                  }
              );
      
          }
      }
      

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

      【讨论】:

        【解决方案3】:

        我知道这个问题已经有了答案,但我想在我通常使用的 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) {
                //...
               }
            ));
        ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-04
          • 2018-09-04
          • 2023-01-02
          • 2022-01-06
          • 2021-10-07
          • 2023-01-23
          相关资源
          最近更新 更多