如何使用 Future 函数正确处理泛型参数?

问题描述

我们正在Flutter 应用程序中实施六边形架构。对于身份验证,我们创建了一个接口,稍后将被身份验证存储库继承。

两个函数使用通用参数:一个用于社交注册,可以更改到身份验证服务(在我们的例子中,Amplify Cognito),另一个接收可以更改的用户属性(再次,取决于服务) .

abstract class AuthRepository {
  Future<List<T>> fetchUserAttributes<T>();
  Future<bool> signInWithSocialWebUI<T>({required T provider});
}

嗯,在存储库中覆盖它们不是问题,但是我在代码级别遇到了一个烦人的错误

enter image description here

如您所见,* 上的类型有所不同(我无法理解,因为这意味着 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 提供程序,我想更改社交身份验证提供程序类型,这会影响原因。

我该如何解决这个错配问题?

非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)