dagger返回类型

o75abkj4  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(311)

当使用使用回调的第三方函数时,我尝试返回指定的类型。我有一个接口

public interface AuthenticationService {
    AuthResult signInEmailPassword(String username, String password, AuthListener listener);
}

在实现接口时,我调用的是一个aws cognito异步函数,该函数使用回调。

public class AwsCognitoAuthenticator implements AuthenticationService {
    @Override
    public AuthResult signUp(String givenName, String username, String password, final AuthListener listener) {
        userPool.signUpInBackground(username, password, userAttributes, null, signupCallback);
    --> return result from signupCallback;
    }
}

调用此方法(signupinbackground)时,如何仍然返回authresult的类型(我不想把它改成void,这样我就可以在界面上使用dagger)。
编辑
我试过很多不同的方法,但都没有成功。我正在尝试将下面的接口作为字段注入到活动中。

@Component(modules = LoginModule.class)
public interface AuthenticationService {
    void signUp(String givenName, String username, String password, AuthListener listener);
    void signInEmailPassword(String username, String password, AuthListener listener);
    void changePassword(String oldPassword, String newPassword);
    void resetPassword();
    void signOut();
}

模块

@Module
public class LoginModule {
    @Provides
    AuthenticationService provideAuthService() {
        return new AwsCognitoAuthenticator();
    }
}

然后,我得到了接口中有参数的三个声明的错误
错误:此方法不是有效的设置方法、成员注入方法或子组件工厂方法。匕首无法实现此方法

r6vfmomb

r6vfmomb1#

您不应该为实现的接口添加注解 @Component . @Component 具体来说,就是定义您希望dagger为您实现的绑定图的接口。

@Component(modules = LoginModule.class)
public interface AuthenticationComponent {
  AuthenticationService getAuthenticationService();
}

上面的代码告诉dagger使用 @Module 你列出的课程和 @Inject -它找到带注解的构造函数来创建您在组件上列出的类。在这里,这个类是authenticationservice,根据您的loginmodule,您将得到一个具体的awscognitoauthenticator。dagger在authenticationcomponent附近生成这个实现,这样您就可以调用 create 要为完全创建的authenticationservice获取工厂,请执行以下操作:

AuthenticationComponent authComponent = DaggerAuthenticationComponent.create();

因为您只有一个绑定,而且它所做的只是手动调用单个构造函数,所以您不会从dagger中获得太多好处。但是,如果您的图随着时间的推移而增长,或者如果您将awscognitoauthenticator更改为需要其他依赖项,那么这很容易增加它的权重。
既然dagger没有参与到authenticationservice接口设计中,那么您可以专注于创建一个干净的api。首先,您需要决定authenticationservice是同步还是异步运行。如果要返回authresult,则需要创建它,因此似乎需要同步行为。也就是说,既然您接受authlistener,那么您似乎已经为异步行为做好了准备。作为api的消费者,我不明白这一点。请尝试下列操作之一:
为每个方法接受authlistener并使用它进行回调。然后你就可以回来了 void . 假设您接受的authlistener有一个方法,可以在后台任务完成并且您知道结果时接受authresult。大多数方法都会返回 void ,因为通常没有authresult同步返回。
返回a ListenableFuture<AuthResult> 而不是authresult。这意味着api的返回值是一个对象,它可以接受authresult就绪时要调用的监听器,因此您不再需要接受authlistener作为参数。这稍微贵一点,因为listenablefuture需要数据结构来接受任意数量的侦听器,但是它的组合可能更好(例如,如果您需要同时侦听多个listenablefuture示例)。
双击同步api,这样您的authenticationservice方法在后台任务完成之前不会返回。在大多数情况下,这是一个坏主意,但这是可能的,然后您可以确保在需要返回时立即得到authresult。

相关问题