ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Flutter-grapqhQL 인자 값 넣어서 쿼리보내기
    개발/flutter 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
          )
        }
      ''';

     

    추후 포스팅

     

    에러 핸들링하기

    페이지 네이션 하기

    댓글

Designed by Tistory.