개발/flutter

Flutter-grapqhQL 인자 값 넣어서 쿼리보내기

덤벨로퍼 2020. 10. 13. 20:09

인자값 쿼리에 넣어서 보내기

 

쿼리를 보낼때 쿼리에 인자값을 넣어줘서 보내줘야할때가있다.

다음은 장바구니에 상품을 추가하는 api 인데 어떤 상품을 어떤 조건으로 넣을건지 서버에게 알려줘야 하기때문에

productQuery를 넣어줘야한다.

String readAddCart(Map<String, dynamic> productQuery) => '''
    mutation {
      addCart(
        input: $productQuery
      )
    }
  ''';

 

input 값에는 이런값들이 들어가야한다.

Map<String, dynamic> toJson() {
  
    return <String, dynamic>{
      'additionalInfo': json.encode(additionalInfo),
      'reserveDate': json.encode(reserveDate),
      'productId': json.encode(productId),
      'reserveTimeScheduleId': json.encode(reserveTimeScheduleId ?? ''),
    };
  }

Product라는 모델을 정의했으며 그안에 toJson()메소드를 만들었다.

addCart 에 필요한 네개의 String 값을(날짜,id,시간id,추가정보) 묶어 json 형태로 반환하며 

값을 json.encode() 로 감싼 이유는

String 값의 경우 값이 "" 쌍따옴표 안에 들어가야하기 때문이다.

{
  additionalInfo:추가정보내용
} 

 

이렇게 들어가면 추가정보내용 이 String 이 아니라 판단 되어 에러발생되어서 이렇게 보내져야한다.

{
  additionalInfo:"추가정보내용" 
}

json.encode(additionalInfo)도 가능하지만

"$additionalInfo" 도 역시 가능하다.

 

reserveTimeScheduleId 의경우 optional 이긴 하나  null 값이 들어가면 안되고 

"" 이렇게 빈 String이 쌍따옴표안에 들어가야한다.

따라서 reserveTimeScheduleId이 null 인경우 "" 가 들어가도록 했다.

 

이제 쿼리를 보낼때

final productQuery = <String, dynamic>{'product': product.toJson()};

이렇게 쿼리 인수값에들어갈 map타입 변수를 만들어 쿼리 안에 넣으면 된다.

 

전체 코드

class AddCartProvider {
  Future<bool> addCart(Product product) {
    return getGraphQLClient().query(_queryOptions(product)).then(_toAddCart);
  }

  QueryOptions _queryOptions(Product product) {
    final productQuery = <String, dynamic>{'orderProduct': product.toJson()};
    return QueryOptions(
      fetchPolicy: FetchPolicy.networkOnly,
      documentNode: gql(readAddCart(productQuery)),
    );
  }

  bool _toAddCart(QueryResult queryResult) {
    if (queryResult.hasException) {
      throw queryResult.exception;
    }
   
    final bool result = queryResult.data['addCart'];
  
    return result;
  }

  String readAddCart(Map<String, dynamic> productQuery) => '''
    mutation {
      addCart(
        input: $productQuery
      )
    }
  ''';

 

추후 포스팅

 

에러 핸들링하기

페이지 네이션 하기