簡體   English   中英

使用 Flutter 和 Ferry 獲取數據后,無法使用來自 GraphQl 查詢的數據

[英]Cannot use data from GraphQl query after getting data using Flutter and Ferry

我目前在一個塊中有一個 function,它正在調用我的存儲庫以使用 GraphQL 從我的服務器獲取數據。 我能夠取回數據。 但是,由於 function 在獲取數據后退出,我無法將其返回到我的集團。

這是我集團中的代碼....

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,其中該方法在以下 class 中實現...

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 function 完成后跳出集團。

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

感謝您的任何幫助,您可以提供。

做就是了:


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

如果您有一個返回值的 function,則將 l 或 r 放入 function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM