HttpException происходит, когда я отправляю запрос на сервер, как показано ниже - PullRequest
0 голосов
/ 29 апреля 2020

Этот метод предназначен для публикации заказа на сервере, который находится в классе провайдера:

 Future<void> addOrder(OrderRequest orderRequest) async {
    final prefs = await SharedPreferences.getInstance();
    String accessToken = prefs.getString(Constants.prefsUserAccessTokenKey);
    String url = Urls.addOrderUrl;
    try {
      var bodyParams = json.encode({
        "Branch": {"Id": orderRequest.branchId},
        "DeliveryAddress":
            orderRequest.addressId == 0 ? {} : {"Id": orderRequest.addressId},
        "InBranch": orderRequest.inBranch,
        "TableNumber": orderRequest.tableNumber.toString(),
        "OrderItems": orderRequest.items,
        "PromoCode": orderRequest.promoCodeId == 0
            ? {}
            : {"Id": orderRequest.promoCodeId}
      });
      print("Url: " + url);
      print("Token: " + accessToken);
      print("Params: " + bodyParams);
      final response = await retry(
          () => http
              .post(url,
                  headers: {
                    "content-type": "application/json",
                    "Accept": "application/json",
                    "Authorization": "Bearer " + accessToken
                  },
                  body: json.encode(bodyParams))
              .timeout(Duration(seconds: 5)),
          retryIf: (e) => e is SocketException || e is TimeoutException);
      final responseData = json.decode(response.body);
      print(responseData);
      if (response.statusCode == 200) {
      } else if (response.statusCode == 401) {
        throw AuthException("401", responseData['Message']);
      } else {
        throw HttpException(responseData['Message']);
      }
    } catch (error) {
      print(error);
      throw error;
    }

  }

, и в своем классе экрана я создаю метод для загрузки своего данные на сервер, которые я использую, когда нажимаю кнопку, которая обрабатывает запрос на публикацию:

Future<void> _addOrder() async {
    OrderRequest request = OrderRequest();
    request.addressId = _selectedAddress.id;
    request.branchId = int.parse(_selectedBranchId);
    request.inBranch = _selectedAddress.id == 0;
    request.items = _cartItemsList;
    request.promoCodeId = _promoCodeId;
    request.tableNumber = _tableNumber;
    try {
      setState(() {
        _isLoading = true;
      });
      await Provider.of<OrderProvider>(context).addOrder(request);
      Provider.of<CartProvider>(context).emptyCart();
      _showDialog("Order Sent", "Your order is sent to restaurant.");
    } on HttpException catch (error) {
      _showDialog("Error adding order", error.message);
    } on SocketException catch (_) {
      _showDialog("Error adding order",
          "Please check your internet connection and try again");
    } on TimeoutException catch (_) {
      _showDialog("Error adding order",
          "Please check your internet connection and try again");
    } on AuthException catch (_) {
      _refreshToken();
    } catch (error) {
      print(error);
      _showDialog("Error adding address", "Something went wrong");
    }
  }

, но когда я нажимаю кнопку заказа t, чтобы отправить запрос на публикацию на сервер я получил эту ошибку:

I/flutter (12421): {Message: Error:Object reference not set to an instance of an object.}
I/flutter (12421): HttpException: Error:Object reference not set to an instance of an object.

1 Ответ

0 голосов
/ 29 апреля 2020

это класс модели, который я использую

class OrderRequest{
  int branchId;
  int addressId;
  bool inBranch;
  int promoCodeId;
  int tableNumber;
  List<CartItem> items;

OrderRequest(
  {
    this.branchId, 
    this.addressId, 
    this.inBranch, 
    this.promoCodeId, 
    this.tableNumber, 
    this.items});
}
...