我们正在Flutter应用程序中实现六边形架构。对于身份验证,我们创建了一个接口,稍后将由身份验证存储库继承。
两个函数使用通用参数:一个用于社交注册,可以根据身份验证服务(在我们的例子中为 Amplify Cognito)进行更改,另一个接收可以更改的用户属性(同样,根据服务)。
abstract class AuthRepository {
Future<List<T>> fetchUserAttributes<T>();
Future<bool> signInWithSocialWebUI<T>({required T provider});
}
好吧,在存储库中覆盖它们不是问题,但是我在代码级别遇到了一个烦人的错误:
如您所见,*上的类型不同(我无法理解,因为它表示C++上的指针):
The argument type 'AuthProvider' can't be assigned to the parameter type 'AuthProvider*'.dartargument_type_not_assignable.
在这种情况下,此错误带有:
@override
Future<bool> signInWithSocialWebUI<AuthProvider>(
{required AuthProvider provider}) async {
try {
SignInResult result =
await _authCategory.signInWithWebUI(provider: provider);
return result.isSignedIn;
} on AmplifyException catch (error) {
// TODO: Catch error for analytics, not required for frontend.
return false;
}
}
在其他情况下,我们得到:
A value of type 'List<AuthUserAttribute*>*' can't be assigned to a variable of type 'List<AuthUserAttribute>'. Try changing the type of the variable, or casting the right-hand type to 'List<AuthUserAttribute>'.dartinvalid_assignment
。
代码是:
@override
Future<List<AuthUserAttribute>>
fetchUserAttributes<AuthUserAttribute>() async {
try {
List<AuthUserAttribute> result =
await _authCategory.fetchUserAttributes();
return result;
} on AmplifyException catch (error) {
// TODO: Catch error for analytics, not required for frontend.
}
}
这两种情况的共同点是我定义这些函数的泛型类型。
这个问题只发生在我使用泛型时,在其他情况下不会;如果我们想更改为Firebase提供程序,它会影响原因,我想更改社交身份验证提供程序类型。
我该如何解决这个不匹配的问题?
非常感谢。