首页 > 解决方案 > 使用 Future 函数如何正确处理泛型参数?

问题描述

我们正在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提供程序,它会影响原因,我想更改社交身份验证提供程序类型。

我该如何解决这个不匹配的问题?

非常感谢。

标签: fluttertemplatesdartgenericshexagonal-architecture

解决方案


推荐阅读