【问题标题】:Cannot use data from GraphQl query after getting data using Flutter and Ferry使用 Flutter 和 Ferry 获取数据后无法使用来自 GraphQl 查询的数据
【发布时间】:2021-05-28 07:41:29
【问题描述】:

我目前在一个块中有一个函数,它正在调用我的存储库以使用 GraphQL 从我的服务器中获取数据。我能够取回数据。但是我无法将它返回到我的 bloc,因为函数在获取数据后退出。

这是我所在区域的代码......

Either<AuthFailure, GLoginData_login> failureOrSuccess;

   failureOrSuccess = await loginWithUsernameAndPassword(username: state.username, password: state.password)
       .whenComplete(() {             <---------- This line is never triggered (why not?)
     failureOrSuccess.fold((l) => null, (r) {
       print('You have the data $r'); 
     });
   });

如您所见,我正在等待 forwardedCall 的响应。

这是我的存储库中该集团调用的代码......

abstract class LoginRepository<TData, TVars, TRequest extends OperationRequest<TData, dynamic>> {
  Future<Either<AuthFailure, GLoginData_login>> loginWithUsernameAndPassword({
    @required Username username,
    @required Password password,
  });
}

此存储库是一个抽象类,其中方法在以下类中实现...

class LoginUser extends LoginRepository {
  
  @override
  Future<Either<AuthFailure, GLoginData_login>> loginWithUsernameAndPassword(
          {@required Username username, @required Password password}) =>
      _runQuery(username: username, password: password);

  Future<Either<AuthFailure, GLoginData_login>> _runQuery(
      {@required Username username, @required Password password}) async {

    final loginReq = GLoginReq(
      (b) => b
        ..vars.LoginInput.username = usernameStr
        ..vars.LoginInput.password = passwordStr,
    );
    try {
    return await GetIt.instance<Client>().request(loginReq).listen((response) {
      if (!response.loading && response.dataSource == DataSource.Link && 
         response.data != null) {
        GLoginData data = response.data;
        GLoginData_login login = data.login;
        return login;
      }

      if (response.linkException != null) {
        return response.graphqlErrors;
      }
    }).asFuture(); <------ I am marking it as a future so that it can be passed back

  } on Exception catch (e) {
  // Will need a created AuthException depending on our API and requirements
  if (e.toString() == 'ERROR_NO_ACCOUNT_MATCHES_DETAILS_GIVEN') {
    return left(const AuthFailure.invalidUsernameAndPaswordCombination());
  } else {
    return left(const AuthFailure.serverError());
  }
 }
}
}

我确实从服务器化客户端响应中接收到数据。但是在我的集团中,我无法对它做任何事情,因为它只是在 loginWithUsernameAndPassword 函数完成后跳出集团。

如何在我的块中使用返回值,whenComplete 值行不起作用。

感谢您提供的任何帮助。

【问题讨论】:

    标签: flutter graphql


    【解决方案1】:

    只是做:

    
    either.fold(
       (l) => Something(),
       (r) => Something(),
    );
    

    如果您有一个返回值的函数,则将 l 或 r 放入函数中。

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多