
Improves JSON deserialization for product and stock picking models by using custom `fromJson` methods and explicit `JsonKey` mappings. This ensures robust parsing of fields like barcode, display name, and product IDs. Adds a new `ecart` getter to calculate the difference between requested and received quantities for stock moves. Updates the reception details page to display a list of products with their requested, received, and calculated difference quantities. Removes redundant JSON-RPC fields from the `stock.picking/web_read` API call.
83 lines
2.5 KiB
Dart
83 lines
2.5 KiB
Dart
import 'package:connectivity_plus/connectivity_plus.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
extension StatefulWidgetExtensions on State<StatefulWidget> {
|
|
/// Check if the widget exist before safely setting state.
|
|
void safeSetState(VoidCallback fn) {
|
|
if (mounted) {
|
|
// ignore: invalid_use_of_protected_member
|
|
setState(fn);
|
|
}
|
|
}
|
|
}
|
|
|
|
String? stringFromJson(dynamic json) {
|
|
if (json is String && json.isNotEmpty) return json;
|
|
return null;
|
|
}
|
|
|
|
double? doubleFromJson(dynamic json) {
|
|
if (json is double) return json;
|
|
return null;
|
|
}
|
|
|
|
int? intFromJson(dynamic json) {
|
|
if (json is int) return json;
|
|
return null;
|
|
}
|
|
|
|
T? objectFromJson<T>(dynamic json, T Function(Map<String, dynamic>) fromJson) {
|
|
if (json is Map<String, dynamic>) return fromJson(json);
|
|
return null;
|
|
}
|
|
|
|
List<T>? listFromJson<T>(
|
|
dynamic json,
|
|
T Function(Map<String, dynamic>) fromJson,
|
|
) {
|
|
if (json is List) {
|
|
return json
|
|
.whereType<Map<String, dynamic>>()
|
|
.map((e) => fromJson(e))
|
|
.toList();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
Future<bool> checkInternetConnexion() async {
|
|
final List<ConnectivityResult> connectivityResult = await (Connectivity()
|
|
.checkConnectivity());
|
|
|
|
// This condition is for demo purposes only to explain every connection type.
|
|
// Use conditions which work for your requirements.
|
|
if (connectivityResult.contains(ConnectivityResult.mobile)) {
|
|
// Mobile network available.
|
|
return true;
|
|
} else if (connectivityResult.contains(ConnectivityResult.wifi)) {
|
|
// Wi-fi is available.
|
|
// Note for Android:
|
|
// When both mobile and Wi-Fi are turned on system will return Wi-Fi only as active network type
|
|
return true;
|
|
} else if (connectivityResult.contains(ConnectivityResult.ethernet)) {
|
|
// Ethernet connection available.
|
|
return true;
|
|
} else if (connectivityResult.contains(ConnectivityResult.vpn)) {
|
|
// Vpn connection active.
|
|
// Note for iOS and macOS:
|
|
// There is no separate network interface type for [vpn].
|
|
// It returns [other] on any device (also simulator)
|
|
return true;
|
|
} else if (connectivityResult.contains(ConnectivityResult.bluetooth)) {
|
|
// Bluetooth connection available.
|
|
return false;
|
|
} else if (connectivityResult.contains(ConnectivityResult.other)) {
|
|
// Connected to a network which is not in the above mentioned networks.
|
|
return false;
|
|
} else if (connectivityResult.contains(ConnectivityResult.none)) {
|
|
// No available network types
|
|
return false;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|