当使用使用回调的第三方函数时,我尝试返回指定的类型。我有一个接口
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();
}
}
然后,我得到了接口中有参数的三个声明的错误
错误:此方法不是有效的设置方法、成员注入方法或子组件工厂方法。匕首无法实现此方法
1条答案
按热度按时间r6vfmomb1#
您不应该为实现的接口添加注解
@Component
.@Component
具体来说,就是定义您希望dagger为您实现的绑定图的接口。上面的代码告诉dagger使用
@Module
你列出的课程和@Inject
-它找到带注解的构造函数来创建您在组件上列出的类。在这里,这个类是authenticationservice,根据您的loginmodule,您将得到一个具体的awscognitoauthenticator。dagger在authenticationcomponent附近生成这个实现,这样您就可以调用create
要为完全创建的authenticationservice获取工厂,请执行以下操作:因为您只有一个绑定,而且它所做的只是手动调用单个构造函数,所以您不会从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。