Problems with API Calls in flutter app Url and nested data

Viewed 28

Hello i'am having a problem in api call with my app Some it is possible to fetch some data but not some other data

exemple : ""barcode_url"

I cannot parse it it is returning a null value could you please Help

Also i would like to reach the value of "1650114000|1650117600"

This is the API

  "parent_id": 0,
  "status": "processing",
  "currency": "EUR",
  "version": "5.9.1",
  "prices_include_tax": true,
  "date_created": "2022-05-05T20:15:44",
  "date_modified": "2022-05-05T20:17:06",
  "discount_total": "0.00",
  "discount_tax": "0.00",
  "shipping_total": "0.00",
  "shipping_tax": "0.00",
  "cart_tax": "16.67",
  "total": "100.00",
  "total_tax": "16.67",
  "customer_id": 4,
  "order_key": "wc_order_rwFRwajfaqLPk",
"date_created_gmt": "2022-05-05T18:15:44",
  "date_modified_gmt": "2022-05-05T18:17:06",
  "date_completed_gmt": null,
  "date_paid_gmt": "2022-05-05T18:17:06",
  "barcode_url": "https://streetmarkets.ch/?wc_barcode=627414a27baf0",
  "currency_symbol": "€",
   meta_data": [
    {
      "id": 30815,
      "key": "_aftership_migrated",
      "value": "ok"
    },
    {
      "id": 30816,
      "key": "_barcode_text",
      "value": "627414a27baf0"
    },
    {
      "id": 30486,
      "key": "_wcfmd_delvery_times",
      "value": {
        "3": "1650114000|1650117600"
      }
      ]
"barcode_url": "https://streetmarkets.ch/?wc_barcode=62598c1568688",

My data are being fetch in a file order.dart and then paste to the screen file order_item_screen

this is the order file i cut it because it was too long but the data are fetch in the part

Order._fromWooJson(Map<String, dynamic> parsedJson) {
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

import '../../common/config.dart';
import '../../common/constants.dart';
import '../../common/tools.dart';
import '../../generated/l10n.dart';
import '../../services/index.dart';
import '../entities/store_delivery_date.dart';
import '../index.dart';
import '../serializers/order.dart';
import 'user_location.dart';

export 'delivery_status.dart';
export 'product_item.dart';
export '../../../models/order/order.dart';

enum OrderStatus {
  pending,
  processing,
  cancelled,
  refunded,
  completed,
  onHold,
  failed,
  //opencart
  shipped,
  delivered,
  reversed,
  canceled,
  canceledReversal,
  chargeback,
  denied,
  expired,
  processed,
  voided,
  unknown,
  refundRequested,
  driverAssigned,
  outForDelivery,
  orderReturned,
}

class Order {
  String? id;
  String? number;
  OrderStatus? status;
  String?
      orderStatus; //in opencart, order_status will be responsed based on language. so I use this property to show on the UI instead of status property if status is unknown
  DateTime? createdAt;
  DateTime? dateModified;
  double? total;
  double? totalTax;
  double? totalShipping;
  String? paymentMethodTitle;
  String? paymentMethod;
  String? shippingMethodTitle;
  String? customerNote;
  String? customerId;
  String? orderkey;
  String? barcodetext;
  String? barcode;
  List<ProductItem> lineItems = [];
  Address? billing;
  Address? shipping;
  String? storeId;
  String? storeName;
  String? addonsOptions;


  double? subtotal;
  DeliveryStatus? deliveryStatus;
  int quantity = 0;
  Store? wcfmStore;
  UserShippingLocation? userShippingLocation;
  AfterShipTracking? aftershipTracking;
  String? deliveryDate;
  List<StoreDeliveryDate>? storeDeliveryDates;

  int get totalQuantity {
    var quantity = 0;
    for (var item in lineItems) {
      quantity += item.quantity ?? 0;
    }
    return quantity;
  }

  Order({this.id, this.number, this.status, this.createdAt, this.total, this.barcode, this.orderkey});

  factory Order.fromJson(Map<String, dynamic>? parsedJson) {
    switch (Config().type) {
      case ConfigType.opencart:
        return Order._fromOpencartJson(parsedJson!);
      case ConfigType.magento:
        return Order._fromMagentoJson(parsedJson!);
      case ConfigType.shopify:
        return Order._fromShopify(parsedJson!);
      case ConfigType.presta:
        return Order._fromPrestashop(parsedJson!);
      case ConfigType.strapi:
        return Order._fromStrapiJson(parsedJson!);
      case ConfigType.notion:
        return Order._fromNotionJson(parsedJson!);
      default:
        return Order._fromWooJson(parsedJson!);
    }
  }


  OrderStatus parseOrderStatus(String? status) {
    final newStatus = status?.toLowerCase();
    switch (newStatus) {
      case 'on-hold':
      case 'holded':
        return OrderStatus.onHold;
      case 'canceled reversal':
        return OrderStatus.canceledReversal;
      case 'complete':
        return OrderStatus.completed;
      case 'driver-assigned':
        return OrderStatus.driverAssigned;
      case 'out-for-delivery':
        return OrderStatus.outForDelivery;
      case 'order-returned':
        return OrderStatus.orderReturned;
      case 'refund-req':
        return OrderStatus.refundRequested;
      case 'authorized':
        return OrderStatus.pending;
      case 'refunded':
        return OrderStatus.refunded;
      case 'void':
        return OrderStatus.voided;
      default:
        return OrderStatus.values.firstWhere(
          (element) => describeEnum(element) == newStatus,
          orElse: () => OrderStatus.unknown,
        );
    }
  }

  DeliveryStatus parseDeliveryStatus(String? status) {
    final newStatus = status?.toLowerCase();
    return DeliveryStatus.values.firstWhere(
      (element) => describeEnum(element) == newStatus,
      orElse: () => DeliveryStatus.unknown,
    );
  }

  Order._fromWooJson(Map<String, dynamic> parsedJson) {
    barcode = parsedJson['barcode_url'].toString();
    try {
      id = parsedJson['id'].toString();
      customerNote = parsedJson['customer_note'];
      number = parsedJson['number'];


      status = parseOrderStatus(parsedJson['status']);
      createdAt = parsedJson['date_created'] != null
          ? DateTime.parse(parsedJson['date_created'])
          : DateTime.now();
      dateModified = parsedJson['date_modified'] != null
          ? DateTime.parse(parsedJson['date_modified'])
          : DateTime.now();
      total =
          parsedJson['total'] != null ? double.parse(parsedJson['total']) : 0.0;
      totalTax = parsedJson['total_tax'] != null
          ? double.parse(parsedJson['total_tax'])
          : 0.0;
      totalShipping = parsedJson['shipping_total'] != null
          ? double.parse(parsedJson['shipping_total'])
          : 0.0;
      paymentMethodTitle = parsedJson['payment_method_title'];
      paymentMethod = parsedJson['payment_method'];

      parsedJson['line_items']?.forEach((item) {
        lineItems.add(ProductItem.fromJson(item));
        quantity += int.parse("${item["quantity"]}");
      });

      billing = Address.fromJson(parsedJson['billing']);
      shipping = Address.fromJson(parsedJson['shipping']);
      shippingMethodTitle = parsedJson['shipping_lines'] != null &&
              parsedJson['shipping_lines'].length > 0
          ? parsedJson['shipping_lines'][0]['method_title']
          : null;
      deliveryStatus =
          parseDeliveryStatus(parsedJson['delivery_status'] ?? 'pending');
      if (parsedJson['user_location'] != null) {
        userShippingLocation =
            UserShippingLocation.fromJson(parsedJson['user_location']);
      }
      if (parsedJson['wcfm_store'] != null) {
        wcfmStore = Store.fromWCFMJson(parsedJson['wcfm_store']);
      }
      customerId = parsedJson['customer_id'].toString();
      orderkey = parsedJson['created_via'].toString();

      // barcode = parsedJson['meta_data'] != null &&
      //     parsedJson['meta_data'].length > 0
      //     ? parsedJson['meta_data'][0]['value']
      //     : null;

      if (parsedJson['meta_data'] != null) {
        for (var item in parsedJson['meta_data']) {
          if (item['key'] == '_barcode_text') {
            barcodetext = item['value'];
          }
        }
      }
///
      final metaData = parsedJson['meta_data'];
      if (metaData is List) {
        if (parsedJson['product_data'] != null &&
            parsedJson['product_data']['type'] == 'appointment') {
          final Map<String, dynamic>? day = metaData.firstWhere(
                  (element) =>
              element['key'] == 'wc_appointments_field_start_date_day',
              orElse: () => null);
          final Map<String, dynamic>? month = metaData.firstWhere(
                  (element) =>
              element['key'] == 'wc_appointments_field_start_date_month',
              orElse: () => null);
          final Map<String, dynamic>? year = metaData.firstWhere(
                  (element) =>
              element['key'] == 'wc_appointments_field_start_date_year',
              orElse: () => null);
          final Map<String, dynamic>? time = metaData.firstWhere(
                  (element) =>
              element['key'] == 'wc_appointments_field_start_date_time',
              orElse: () => null);
          if (day != null && month != null && year != null && time != null) {
            final dateTime = DateTime.parse(
                "${year['value']}-${Tools.getTimeWith2Digit(month['value'])}-${Tools.getTimeWith2Digit(day['value'])} ${time['value']}");
            addonsOptions = Tools.convertDateTime(dateTime);
          }
        } else {
          addonsOptions = '';
          if (parsedJson['product_data'] != null) {
            final productMetaData = parsedJson['product_data']?['meta_data'];
            for (var item in productMetaData) {
              if (item['key'] == '_product_addons') {
                addonsOptions = metaData.map((e) => e['value']).join(', ');
                break;
              }
            }
          }
        }

        for (var attr in metaData) {
          if (attr['key'] == '_vendor_id') {
            storeId = parsedJson['value'];
            storeName = parsedJson['display_value'];
          }
        }
      }


      /// GET AFTERSHIP TRACKING & DELIVERY DATE
      if (parsedJson['meta_data'] != null) {
        var providerName = '';
        var trackingNumber = '';
        for (var item in parsedJson['meta_data']) {
          if (item['key'] == '_aftership_tracking_number') {
            trackingNumber = item['value'];
          }
          if (item['key'] == '_aftership_tracking_provider_name') {
            providerName = item['value'];
          }
          if (item['key'] == '_orddd_timestamp') {
            var format = DateFormat('dd-MM-yyyy');
            if (item['value'] != null && item['value'].isNotEmpty) {
              var timeStamp = int.parse(item['value'].toString());
              timeStamp = timeStamp * 1000;
              deliveryDate = format.format(
                DateTime.fromMillisecondsSinceEpoch(timeStamp),
              );
            }
          }
          if (item['key'] == '_wcfmd_delvery_times') {
            storeDeliveryDates = [];
            final deliveryDateMap = item['value'];
            if (deliveryDateMap is Map) {
              deliveryDateMap.forEach((key, value) {
                storeDeliveryDates!
                    .add(StoreDeliveryDate(storeId: key, dateTime: value));
              });
            }
          }
        }
        if (!providerName.isEmptyOrNull && !trackingNumber.isEmptyOrNull) {
          aftershipTracking = AfterShipTracking(trackingNumber, providerName);
        }
      }
    } catch (e, trace) {
      printLog(e.toString());
      printLog(trace.toString());
    }
  }

and they are being displayed like that

import 'package:easy_debounce/easy_debounce.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fstore/models/order/order.dart';
import '../../../models/entities/store_delivery_date.dart';
import 'package:inspireui/widgets/skeleton_widget/skeleton_widget.dart';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';


import '../../../common/config.dart';
import '../../../common/constants.dart';
import '../../../common/tools.dart';
import '../../../generated/l10n.dart';
import '../../../models/entities/delivery_user.dart';
import '../../../models/index.dart' show AppModel, OrderNote;
//import '../../../models/order/order.dart';
//import '../../../models/order/product_item.dart';
import '../../../screens/order_history/views/widgets/product_order_item.dart';
import '../../../services/dependency_injection.dart';
import '../../../widgets/common/box_comment.dart';
import '../../../widgets/common/expansion_info.dart';
import '../../../widgets/html/index.dart';
import '../config/app_config.dart';
import '../models/authentication_model.dart';
import '../services/vendor_admin.dart';

part '../actions/order_item_details_actions.dart';

class VendorAdminOrderItemDetailsScreen extends StatefulWidget {
  final Order? order;
  final Function? onCallBack;
  final ProductItem? lineItem;
  final List<StoreDeliveryDate>? storeDeliveryDates;



  const VendorAdminOrderItemDetailsScreen(
      {Key? key, this.order, this.onCallBack,this.lineItem,this.storeDeliveryDates})
      : super(key: key);

  @override
  _VendorAdminOrderItemDetailsScreenState createState() =>
      _VendorAdminOrderItemDetailsScreenState();
}

class _VendorAdminOrderItemDetailsScreenState
    extends State<VendorAdminOrderItemDetailsScreen> {
  final _noteController = TextEditingController();
  final fontSize = 16.0;
  final _services = injector<VendorAdminService>();
  final _perPage = 10;
  int page = 1;
  List<OrderNote> orderNotes = [];
  final statuses = OrderStatus.values;
  OrderStatus? _dropdownStatusValue;
  bool _enableEdit = false;
  final List<DeliveryUser> _deliveryUsers = [];
  final _list = <OrderStatus>[
    OrderStatus.pending,
    OrderStatus.processing,
    OrderStatus.cancelled,
    OrderStatus.refunded,
    OrderStatus.completed,
    OrderStatus.onHold,
    OrderStatus.failed
  ];
  
  }


  @override
  void initState() {
    fetchdata();
    _dropdownStatusValue = widget.order!.status;
    super.initState();

    WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
      _getOrderNotes();
    });
  }

  void _onDeliveryUserAssigned(DeliveryUser user) {
    final index = _deliveryUsers.indexWhere((element) => element.id == user.id);
    if (index == -1) {
      _deliveryUsers.add(user);
    }
  }

  @override
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    final currencyRate =
        Provider.of<AppModel>(context, listen: false).currencyRate;

    return Scaffold(
      appBar: AppBar(
        title: Text(
          S.of(context).orderDetail,
          style: Theme.of(context).primaryTextTheme.headline5,
        ),
        iconTheme: Theme.of(context).iconTheme,
        backgroundColor: Theme.of(context).backgroundColor,
        actions: [
          InkWell(
            onTap: () => setState(() {
              _enableEdit = !_enableEdit;
              if (!_enableEdit) {
                _cancelEdit();
              }
            }),
            child: Center(
              child: Padding(
                padding: const EdgeInsets.only(right: 15.0, left: 15.0),
                child: Text(
                    !_enableEdit
                        ? S.of(context).editWithoutColon
                        : S.of(context).cancel,
                    style: TextStyle(
                      color: Theme.of(context).iconTheme.color,
                    )),
              ),
            ),
          ),
        ],
        centerTitle: true,
      ),
      floatingActionButton: _enableEdit
          ? InkWell(
              onTap: _updateOrder,
              child: Container(
                padding:
                    const EdgeInsets.symmetric(horizontal: 50, vertical: 15.0),
                decoration: BoxDecoration(
                  color: Colors.blueAccent,
                  borderRadius: BorderRadius.circular(10.0),
                ),
                child: Text(
                  S.of(context).updateStatus,
                  style: const TextStyle(color: Colors.white),
                ),
              ),
            )
          : Container(),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      body: Container(
        width: size.width,
        height: size.height,
        padding: const EdgeInsets.symmetric(
          horizontal: 20.0,
        ),
        child: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              const SizedBox(height: 20),

              Row(
                children: [
                  Expanded(
                    child: Text(
                      '#${widget.order!.number}',
                      style: TextStyle(
                          fontWeight: FontWeight.bold, fontSize: fontSize),
                    ),
                  ),
                  if (!_enableEdit ||
                      (_enableEdit &&
                          [
                            OrderStatus.canceled,
                            OrderStatus.cancelled,
                            OrderStatus.refunded,
                            OrderStatus.failed
                          ].contains(widget.order!.status)))
                    Container(
                      padding: const EdgeInsets.symmetric(
                          horizontal: 10.0, vertical: 5.0),
                      decoration: BoxDecoration(
                        color: Colors.grey.withOpacity(0.1),
                        borderRadius: BorderRadius.circular(5.0),
                      ),
                      child: Text(
                        widget.order!.status!.getTranslation(context),
                        style: TextStyle(
                            color: widget.order!.status!.displayColor,
                            fontSize: fontSize),
                      ),
                    ),
                  if (_enableEdit &&
                      ![
                        OrderStatus.canceled,
                        OrderStatus.cancelled,
                        OrderStatus.refunded,
                        OrderStatus.failed
                      ].contains(widget.order!.status))
                    _buildListStatuses(),
                ],
              ),
              const SizedBox(height: 5),
              Text(
                widget.order!.createdAt.toString(),
                style: TextStyle(fontSize: fontSize),
              ),
              Text(
                widget.order!.barcode.toString(),
                style: TextStyle(fontSize: fontSize),
              ),
              Text(
                '${_deliveryDate}',
                style: TextStyle(fontSize: fontSize),
              ),
              Text(
                widget.order!.orderkey.toString(),
                style: TextStyle(fontSize: fontSize),
              ) 

thank you

1 Answers

You can check if it's null and set a default value

barcode = parsedJson['barcode_url'] != null ? parsedJson['barcode_url']:"",
Related