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