diff --git a/lib/data/provider/auth_fb.dart b/lib/data/provider/auth_fb.dart index 15d9dc1..6062f1a 100644 --- a/lib/data/provider/auth_fb.dart +++ b/lib/data/provider/auth_fb.dart @@ -9,7 +9,7 @@ import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/domain/exceiptions/signin_exception.dart'; import 'package:fcs/helpers/api_helper.dart'; import 'package:fcs/helpers/firebase_helper.dart'; -import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth/firebase_auth.dart' as fb; import 'package:logging/logging.dart'; class AuthFb { @@ -18,17 +18,17 @@ class AuthFb { static final AuthFb instance = AuthFb._(); AuthFb._(); - StreamController controller; - static final FirebaseAuth _fb = FirebaseAuth.instance; - static String _verificationId; + late StreamController controller; + static final fb.FirebaseAuth _fb = fb.FirebaseAuth.instance; + static String _verificationId = ''; Future sendSmsCodeToPhoneNumber(String phoneNumber) { Completer completer = Completer(); bool codeSentCompleted = false; - final PhoneVerificationCompleted verificationCompleted = - (AuthCredential credential) async { - AuthResult _authResult; + final fb.PhoneVerificationCompleted verificationCompleted = + (fb.AuthCredential credential) async { + fb.UserCredential _authResult; try { _authResult = await _fb.signInWithCredential(credential); print("PhoneVerificationCompleted :$_authResult"); @@ -48,23 +48,23 @@ class AuthFb { 'Inside _sendCodeToPhoneNumber: signInWithPhoneNumber auto succeeded: ${_authResult.user}'); }; - final PhoneVerificationFailed verificationFailed = - (AuthException authException) async { + final fb.PhoneVerificationFailed verificationFailed = + (fb.FirebaseAuthException authException) async { print( 'Phone number verification failed. Code: ${authException.code}. Message: ${authException.message}'); completer.completeError(SigninException( "Phone number verification failed:${authException.message}")); }; - final PhoneCodeSent codeSent = - (String verificationId, [int forceResendingToken]) async { + final fb.PhoneCodeSent codeSent = + (String verificationId, [int? forceResendingToken]) async { _verificationId = verificationId; print("codeSent " + phoneNumber); codeSentCompleted = true; completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT)); }; - final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = + final fb.PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = (String verificationId) { print("codeAutoRetrievalTimeout $verificationId "); @@ -89,11 +89,11 @@ class AuthFb { Future signInWithPhoneNumber(String smsCode) async { try { - final AuthCredential credential = PhoneAuthProvider.getCredential( - verificationId: _verificationId, - smsCode: smsCode, - ); - AuthResult _authResult = await _fb.signInWithCredential(credential); + final fb.AuthCredential credential = fb.PhoneAuthProvider.credential( + verificationId: _verificationId, smsCode: smsCode); + + fb.UserCredential _authResult = + await _fb.signInWithCredential(credential); if (_authResult == null) { throw SigninException("Sigin error!"); } @@ -105,19 +105,21 @@ class AuthFb { } Future signout() async { - if (userListener != null) await userListener.cancel(); + if (userListener != null) await userListener!.cancel(); return _fb.signOut(); } Future _addUserToStream({bool refreshIdToken = false}) async { - FirebaseUser firebaseUser = await _fb.currentUser(); + fb.User? firebaseUser = _fb.currentUser; if (firebaseUser == null) return null; - Map claims = await getClaims(refreshIdToken: refreshIdToken); + Map? claims = + await getClaims(refreshIdToken: refreshIdToken); log.info("Claims:$claims"); + if (claims == null) return; String cid = claims["cid"]; - User user; + User? user; if (cid != null && cid != "") { user = await _getUserFromFirestore(cid); } @@ -136,20 +138,20 @@ class AuthFb { controller.add(user); } - Future _getUserFromFirestore(String userID) async { - DocumentSnapshot snap = await Firestore.instance + Future _getUserFromFirestore(String userID) async { + DocumentSnapshot snap = await FirebaseFirestore.instance .collection(user_collection) - .document(userID) + .doc(userID) .get(); if (snap.exists) { - User user = User.fromMap(snap.data, snap.documentID); + User user = User.fromMap(snap.data() as Map, snap.id); return user; } return null; } Future isLogin() async { - final FirebaseUser firebaseUser = await _fb.currentUser(); + final fb.User? firebaseUser = _fb.currentUser; return Future.value(firebaseUser != null); } @@ -193,48 +195,50 @@ class AuthFb { } Stream settings() async* { - Stream snapshot = Firestore.instance + Stream snapshot = FirebaseFirestore.instance .collection(config_collection) - .document(setting_doc_id) + .doc(setting_doc_id) .snapshots(); await for (var snap in snapshot) { - Setting setting = Setting.fromMap(snap.data); + Setting setting = Setting.fromMap(snap.data() as Map); yield setting; } } - Future _getCurrentUserID() async { - FirebaseUser firebaseUser = await _fb.currentUser(); + Future _getCurrentUserID() async { + fb.User? firebaseUser = _fb.currentUser; if (firebaseUser == null) return null; - Map claims = await getClaims(); + Map? claims = await getClaims(); + if (claims == null) return null; String cid = claims["cid"]; return cid; } Future _startUserListener() async { - if (userListener != null) userListener.cancel(); - String _userID = await _getCurrentUserID(); + if (userListener != null) userListener!.cancel(); + String? _userID = await _getCurrentUserID(); if (_userID == null) { return; } - Stream snapshot = Firestore.instance + Stream snapshot = FirebaseFirestore.instance .collection(user_collection) - .document(_userID) + .doc(_userID) .snapshots(); userListener = snapshot.listen((snap) async { - User user = User.fromMap(snap.data, snap.documentID); + User user = User.fromMap(snap.data() as Map, snap.id); - FirebaseUser firebaseUser = await _fb.currentUser(); + fb.User? firebaseUser = _fb.currentUser; if (firebaseUser == null) { - userListener.cancel(); + userListener?.cancel(); return; } try { // get privilege from claim - IdTokenResult idToken = await firebaseUser.getIdToken(refresh: true); - String privileges = idToken.claims["pr"]; + fb.IdTokenResult idToken = await firebaseUser.getIdTokenResult(true); + + String privileges = idToken.claims?["pr"] ?? ''; if (privileges != null && privileges != "") { user.privileges = privileges.split(":").toList(); } @@ -245,13 +249,13 @@ class AuthFb { }); } - StreamSubscription userListener; - Stream user() { + StreamSubscription? userListener; + Stream user() { // ignore: close_sinks - StreamSubscription authListener; + StreamSubscription? authListener; Future _start() async { - authListener = _fb.onAuthStateChanged.listen((firebaseUser) async { + authListener = _fb.authStateChanges().listen((firebaseUser) { if (firebaseUser == null) { controller.add(null); } else { @@ -263,10 +267,10 @@ class AuthFb { void _stop() { if (userListener != null) { - userListener.cancel(); + userListener!.cancel(); } if (authListener != null) { - authListener.cancel(); + authListener!.cancel(); } } diff --git a/lib/data/provider/carton_data_provider.dart b/lib/data/provider/carton_data_provider.dart index 7f74557..622b8c8 100644 --- a/lib/data/provider/carton_data_provider.dart +++ b/lib/data/provider/carton_data_provider.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/domain/constants.dart'; @@ -36,7 +35,7 @@ class CartonDataProvider { } Future> searchCarton(String term) async { - if (term == null || term == '') return List(); + if (term == null || term == '') return []; // var bytes = utf8.encode(term); // var base64Str = base64.encode(bytes); @@ -45,7 +44,7 @@ class CartonDataProvider { try { String path = "/$cartons_collection"; - var querySnap = await Firestore.instance + var querySnap = await FirebaseFirestore.instance .collection(path) .where("carton_number", isEqualTo: term) .where("carton_type", @@ -53,13 +52,11 @@ class CartonDataProvider { .where("status", isEqualTo: carton_packed_status) .where("is_deleted", isEqualTo: false) .orderBy("user_name") - .getDocuments(); - return querySnap.documents - .map((e) => Carton.fromMap(e.data, e.documentID)) - .toList(); + .get(); + return querySnap.docs.map((e) => Carton.fromMap(e.data(), e.id)).toList(); } catch (e) { log.warning("carton error:" + e.toString()); - return null; + return []; } } } diff --git a/lib/data/provider/package_data_provider.dart b/lib/data/provider/package_data_provider.dart index e0d99a2..8183eaa 100644 --- a/lib/data/provider/package_data_provider.dart +++ b/lib/data/provider/package_data_provider.dart @@ -56,8 +56,8 @@ class PackageDataProvider { token: await getToken()); } - Future> ftsSearchPackage(String term) async { - if (term == null || term == '') return List(); + Future?> ftsSearchPackage(String term) async { + if (term == null || term == '') return []; var bytes = utf8.encode(term); var base64Str = base64.encode(bytes); @@ -72,7 +72,7 @@ class PackageDataProvider { "/api/fts/$packages_collection/$escapePackage/$limit", "GET", url: Config.instance.reportURL, token: await getToken()); - if (data == null) return List(); + if (data == null) return []; data.forEach((p) { var package = Package.fromJson(p); @@ -86,7 +86,7 @@ class PackageDataProvider { } Future> searchPackage(String term) async { - if (term == null || term == '') return List(); + if (term == null || term == '') return []; List packages = []; diff --git a/lib/data/provider/rate_data_provider.dart b/lib/data/provider/rate_data_provider.dart index c8c416e..0ffc089 100644 --- a/lib/data/provider/rate_data_provider.dart +++ b/lib/data/provider/rate_data_provider.dart @@ -16,33 +16,33 @@ class RateDataProvider { static final RateDataProvider instance = RateDataProvider._(); RateDataProvider._(); - StreamController controller; + late StreamController controller; static Rate _rate = Rate(); Stream _rateStream() async* { - Stream snapshot = Firestore.instance + Stream snapshot = FirebaseFirestore.instance .collection(config_collection) - .document(rate_doc_id) + .doc(rate_doc_id) .snapshots(); await for (var snap in snapshot) { - Rate rate = Rate.fromMap(snap.data); + Rate rate = Rate.fromMap(snap.data() as Map); yield rate; } } Stream> _cargoTypeStream() async* { List cargoTypes = []; - Stream snapshots = Firestore.instance + Stream snapshots = FirebaseFirestore.instance .collection(config_collection) - .document(rate_doc_id) + .doc(rate_doc_id) .collection(cargo_types_collection) .where("custom_duty", isEqualTo: false) .snapshots(); await for (var snaps in snapshots) { cargoTypes = []; - cargoTypes = snaps.documents.map((snap) { - return CargoType.fromMap(snap.data, snap.documentID); + cargoTypes = snaps.docs.map((snap) { + return CargoType.fromMap(snap.data() as Map, snap.id); }).toList(); yield cargoTypes; @@ -51,17 +51,17 @@ class RateDataProvider { Stream> _customDutiesStream() async* { List customDuries = []; - Stream snapshots = Firestore.instance + Stream snapshots = FirebaseFirestore.instance .collection(config_collection) - .document(rate_doc_id) + .doc(rate_doc_id) .collection(cargo_types_collection) .where("custom_duty", isEqualTo: true) .snapshots(); await for (var snaps in snapshots) { customDuries = []; - customDuries = snaps.documents.map((snap) { - return CargoType.fromMap(snap.data, snap.documentID); + customDuries = snaps.docs.map((snap) { + return CargoType.fromMap(snap.data() as Map, snap.id); }).toList(); yield customDuries; } @@ -69,25 +69,26 @@ class RateDataProvider { Stream> _discountByWeightStream() async* { List discountByWeight = []; - Stream snapshots = Firestore.instance + Stream snapshots = FirebaseFirestore.instance .collection(config_collection) - .document(rate_doc_id) + .doc(rate_doc_id) .collection(discounts_by_weights_collection) .snapshots(); await for (var snaps in snapshots) { discountByWeight = []; - discountByWeight = snaps.documents.map((snap) { - return DiscountByWeight.fromMap(snap.data, snap.documentID); + discountByWeight = snaps.docs.map((snap) { + return DiscountByWeight.fromMap( + snap.data() as Map, snap.id); }).toList(); yield discountByWeight; } } - StreamSubscription rateListener; - StreamSubscription> cargoListener; - StreamSubscription> customListener; - StreamSubscription> discountListener; + late StreamSubscription rateListener; + late StreamSubscription> cargoListener; + late StreamSubscription> customListener; + late StreamSubscription> discountListener; Stream rate() { Future _start() async { rateListener = _rateStream().listen((rate) { diff --git a/lib/data/provider/user_data_provider.dart b/lib/data/provider/user_data_provider.dart index 99ec833..3fc8394 100644 --- a/lib/data/provider/user_data_provider.dart +++ b/lib/data/provider/user_data_provider.dart @@ -37,23 +37,23 @@ class UserDataProvider { payload: {"token": token}, token: await getToken()); } - Future findUser(String phoneNumber) async { - QuerySnapshot querySnap = await Firestore.instance + Future findUser(String phoneNumber) async { + QuerySnapshot querySnap = await FirebaseFirestore.instance .collection(user_collection) .where("phone_number", isEqualTo: phoneNumber) .limit(1) - .getDocuments(); + .get(); - if (querySnap.documents.length > 0) { - var snap = querySnap.documents.first; - User user = User.fromMap(snap.data, snap.documentID); + if (querySnap.docs.length > 0) { + var snap = querySnap.docs.first; + User user = User.fromMap(snap.data() as Map, snap.id); return user; } return null; } Future> searchUser(String term) async { - if (term == null || term == '') return List(); + if (term == null || term == '') return []; var bytes = utf8.encode(term); var base64Str = base64.encode(bytes); @@ -68,7 +68,7 @@ class UserDataProvider { "/api/fts/$user_collection/$escapeBuyer/$limit", "GET", url: Config.instance.reportURL, token: await getToken()); - if (data == null) return List(); + if (data == null) return []; data.forEach((buyer) { var user = User.fromJson(buyer); @@ -76,7 +76,7 @@ class UserDataProvider { }); } catch (e) { log.warning("buyer error:" + e.toString()); - return null; + // return null; } return users; } diff --git a/lib/data/services/auth_imp.dart b/lib/data/services/auth_imp.dart index 05b36ec..056907f 100644 --- a/lib/data/services/auth_imp.dart +++ b/lib/data/services/auth_imp.dart @@ -3,17 +3,16 @@ import 'package:fcs/domain/entities/auth_result.dart'; import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/entities/setting.dart'; import 'package:fcs/domain/entities/user.dart'; -import 'package:flutter/material.dart'; import 'auth_service.dart'; class AuthServiceImp implements AuthService { AuthServiceImp({ - @required this.authFb, - @required this.connectivity, + required this.authFb, + required this.connectivity, }); - final Connectivity connectivity; + final Connectivity? connectivity; final AuthFb authFb; @override @@ -32,7 +31,7 @@ class AuthServiceImp implements AuthService { } @override - Stream getUserStream() { + Stream getUserStream() { return authFb.user(); } diff --git a/lib/data/services/auth_service.dart b/lib/data/services/auth_service.dart index dad8ce7..a276495 100644 --- a/lib/data/services/auth_service.dart +++ b/lib/data/services/auth_service.dart @@ -11,6 +11,6 @@ abstract class AuthService { Future updateProfileName(String newUserName); Future updatePreferredCurrency(String currency); Future hasInvite(); - Stream getUserStream(); + Stream getUserStream(); Stream getSetting(); } diff --git a/lib/data/services/carton_imp.dart b/lib/data/services/carton_imp.dart index ba97084..402f48e 100644 --- a/lib/data/services/carton_imp.dart +++ b/lib/data/services/carton_imp.dart @@ -1,17 +1,16 @@ import 'package:fcs/data/provider/carton_data_provider.dart'; import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/connectivity.dart'; -import 'package:flutter/material.dart'; import 'carton_service.dart'; class CartonServiceImp implements CartonService { CartonServiceImp({ - @required this.cartonDataProvider, - @required this.connectivity, + required this.cartonDataProvider, + required this.connectivity, }); - final Connectivity connectivity; + final Connectivity? connectivity; final CartonDataProvider cartonDataProvider; @override diff --git a/lib/data/services/common_imp.dart b/lib/data/services/common_imp.dart index 74e0654..cfc24e0 100644 --- a/lib/data/services/common_imp.dart +++ b/lib/data/services/common_imp.dart @@ -2,13 +2,12 @@ import 'package:fcs/data/provider/common_data_provider.dart'; import 'package:fcs/domain/entities/discount.dart'; import 'package:fcs/domain/entities/payment_method.dart'; import 'package:fcs/domain/vo/message.dart'; -import 'package:flutter/material.dart'; import 'common_service.dart'; class CommonServiceImp implements CommonService { CommonServiceImp({ - @required this.commonDataProvider, + required this.commonDataProvider, }); final CommonDataProvider commonDataProvider; diff --git a/lib/data/services/delivery_address_imp.dart b/lib/data/services/delivery_address_imp.dart index 96d8a36..d60219a 100644 --- a/lib/data/services/delivery_address_imp.dart +++ b/lib/data/services/delivery_address_imp.dart @@ -1,17 +1,16 @@ import 'package:fcs/data/provider/delivery_address_data_provider.dart'; import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; -import 'package:flutter/material.dart'; import 'delivery_address_service.dart'; class DeliveryAddressImp implements DeliveryAddressService { DeliveryAddressImp({ - @required this.connectivity, - @required this.deliveryAddressDataProvider, + required this.connectivity, + required this.deliveryAddressDataProvider, }); - final Connectivity connectivity; + final Connectivity? connectivity; final DeliveryAddressDataProvider deliveryAddressDataProvider; @override diff --git a/lib/data/services/fcs_shipment_imp.dart b/lib/data/services/fcs_shipment_imp.dart index 6ffaafa..35e5071 100644 --- a/lib/data/services/fcs_shipment_imp.dart +++ b/lib/data/services/fcs_shipment_imp.dart @@ -1,17 +1,16 @@ import 'package:fcs/data/provider/fcs_shipment_data_provider.dart'; import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/entities/fcs_shipment.dart'; -import 'package:flutter/material.dart'; import 'fcs_shipment_service.dart'; class FcsShipmentServiceImp implements FcsShipmentService { FcsShipmentServiceImp({ - @required this.connectivity, - @required this.shipmentDataProvider, + required this.connectivity, + required this.shipmentDataProvider, }); - final Connectivity connectivity; + final Connectivity? connectivity; final FcsShipmentDataProvider shipmentDataProvider; @override diff --git a/lib/data/services/invoice_imp.dart b/lib/data/services/invoice_imp.dart index c26dab4..de8e1d0 100644 --- a/lib/data/services/invoice_imp.dart +++ b/lib/data/services/invoice_imp.dart @@ -1,21 +1,17 @@ import 'package:fcs/data/provider/invoice_data_provider.dart'; -import 'package:fcs/data/provider/shipment_data_provider.dart'; -import 'package:fcs/data/services/shipment_service.dart'; import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/entities/invoice.dart'; import 'package:fcs/domain/entities/payment.dart'; -import 'package:fcs/domain/entities/shipment.dart'; -import 'package:flutter/material.dart'; import 'invoice_service.dart'; class InvoiceServiceImp implements InvoiceService { InvoiceServiceImp({ - @required this.invoiceDataProvider, - @required this.connectivity, + required this.invoiceDataProvider, + required this.connectivity, }); - final Connectivity connectivity; + final Connectivity? connectivity; final InvoiceDataProvider invoiceDataProvider; @override diff --git a/lib/data/services/package_imp.dart b/lib/data/services/package_imp.dart index 75f0b56..f200147 100644 --- a/lib/data/services/package_imp.dart +++ b/lib/data/services/package_imp.dart @@ -1,17 +1,16 @@ import 'package:fcs/data/provider/package_data_provider.dart'; import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/entities/package.dart'; -import 'package:flutter/material.dart'; import 'package_service.dart'; class PackageServiceImp implements PackageService { PackageServiceImp({ - @required this.connectivity, - @required this.packageDataProvider, + required this.connectivity, + required this.packageDataProvider, }); - final Connectivity connectivity; + final Connectivity? connectivity; final PackageDataProvider packageDataProvider; @override @@ -30,7 +29,7 @@ class PackageServiceImp implements PackageService { } @override - Future> ftsSearchPackage(String term) { + Future?> ftsSearchPackage(String term) { return packageDataProvider.ftsSearchPackage(term); } diff --git a/lib/data/services/package_service.dart b/lib/data/services/package_service.dart index ca00c58..2d27585 100644 --- a/lib/data/services/package_service.dart +++ b/lib/data/services/package_service.dart @@ -7,7 +7,7 @@ abstract class PackageService { Future deleteReceiving(Package package); Future updateProcessing(Package package); Future deleteProcessing(Package package); - Future> ftsSearchPackage(String term); + Future?> ftsSearchPackage(String term); Future> searchPackage(String term); Future changeDeliveryAddress(String packageID, String deliveryID); Future packageReturn(String packageID); diff --git a/lib/data/services/rate_imp.dart b/lib/data/services/rate_imp.dart index 6bea2ee..ad1d0e9 100644 --- a/lib/data/services/rate_imp.dart +++ b/lib/data/services/rate_imp.dart @@ -4,17 +4,16 @@ import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/entities/discount_by_weight.dart'; import 'package:fcs/domain/entities/custom_duty.dart'; import 'package:fcs/domain/entities/rate.dart'; -import 'package:flutter/material.dart'; import 'rate_service.dart'; class RateServiceImp implements RateService { RateServiceImp({ - @required this.rateDataProvider, - @required this.connectivity, + required this.rateDataProvider, + required this.connectivity, }); - final Connectivity connectivity; + final Connectivity? connectivity; final RateDataProvider rateDataProvider; @override diff --git a/lib/data/services/services.dart b/lib/data/services/services.dart index aee169b..b2e15d0 100644 --- a/lib/data/services/services.dart +++ b/lib/data/services/services.dart @@ -35,17 +35,18 @@ import 'user_service.dart'; class Services { static final Services instance = Services._(); - AuthService _authService; - UserService _userService; - PackageService _packageService; - MessagingService _messagingService; - CommonService _commonService; - FcsShipmentService _fcsShipmentService; - DeliveryAddressService _deliveryAddressService; - RateService _rateService; - ShipmentService _shipmentService; - CartonService _cartonService; - InvoiceService _invoiceService; + late AuthService _authService; + late UserService _userService; + late PackageService _packageService; + late MessagingService _messagingService; + late CommonService _commonService; + late FcsShipmentService _fcsShipmentService; + late DeliveryAddressService _deliveryAddressService; + late RateService _rateService; + late ShipmentService _shipmentService; + late CartonService _cartonService; + late InvoiceService _invoiceService; + Services._() { _authService = AuthServiceImp( authFb: AuthFb.instance, diff --git a/lib/data/services/shipment_imp.dart b/lib/data/services/shipment_imp.dart index 8aeb11d..0b3a784 100644 --- a/lib/data/services/shipment_imp.dart +++ b/lib/data/services/shipment_imp.dart @@ -2,15 +2,14 @@ import 'package:fcs/data/provider/shipment_data_provider.dart'; import 'package:fcs/data/services/shipment_service.dart'; import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/entities/shipment.dart'; -import 'package:flutter/material.dart'; class ShipmentServiceImp implements ShipmentService { ShipmentServiceImp({ - @required this.shipmentDataProvider, - @required this.connectivity, + required this.shipmentDataProvider, + required this.connectivity, }); - final Connectivity connectivity; + final Connectivity? connectivity; final ShipmentDataProvider shipmentDataProvider; @override diff --git a/lib/data/services/user_imp.dart b/lib/data/services/user_imp.dart index d3b7685..9b5305a 100644 --- a/lib/data/services/user_imp.dart +++ b/lib/data/services/user_imp.dart @@ -1,17 +1,16 @@ import 'package:fcs/data/provider/user_data_provider.dart'; import 'package:fcs/domain/entities/connectivity.dart'; import 'package:fcs/domain/entities/user.dart'; -import 'package:flutter/material.dart'; import 'user_service.dart'; class UserServiceImp implements UserService { UserServiceImp({ - @required this.connectivity, - @required this.userDataProvider, + required this.connectivity, + required this.userDataProvider, }); - final Connectivity connectivity; + final Connectivity? connectivity; final UserDataProvider userDataProvider; @override @@ -30,7 +29,7 @@ class UserServiceImp implements UserService { } @override - Future findUser(String phoneNumber) { + Future findUser(String phoneNumber) { return userDataProvider.findUser(phoneNumber); } diff --git a/lib/data/services/user_service.dart b/lib/data/services/user_service.dart index 168193d..0dd4297 100644 --- a/lib/data/services/user_service.dart +++ b/lib/data/services/user_service.dart @@ -4,7 +4,7 @@ abstract class UserService { Future inviteUser(String userName, String phoneNumber); Future deleteInvite(String phoneNumber); Future acceptRequest(String userID); - Future findUser(String phoneNumber); + Future findUser(String phoneNumber); Future> searchUser(String term); Future uploadMsgToken(String token); Future removeMsgToken(String token); diff --git a/lib/domain/entities/auth_result.dart b/lib/domain/entities/auth_result.dart index dd989fd..5467733 100644 --- a/lib/domain/entities/auth_result.dart +++ b/lib/domain/entities/auth_result.dart @@ -1,9 +1,9 @@ import 'auth_status.dart'; class AuthResult { - AuthStatus authStatus; - String authErrorCode; - String authErrorMsg; + AuthStatus? authStatus; + String? authErrorCode; + String? authErrorMsg; AuthResult({this.authStatus, this.authErrorCode, this.authErrorMsg}); } diff --git a/lib/domain/entities/cargo_type.dart b/lib/domain/entities/cargo_type.dart index 68ec494..0e165ea 100644 --- a/lib/domain/entities/cargo_type.dart +++ b/lib/domain/entities/cargo_type.dart @@ -1,28 +1,28 @@ class CargoType { - String id; - String name; + String? id; + String? name; double rate; double weight; bool isChecked; int qty; - bool isCutomDuty; + bool? isCutomDuty; double customDutyFee; - - double get calAmount => (calRate ?? 0) * (calWeight ?? 0); - double calRate; double calWeight; + + double get calAmount => calRate * calWeight; + CargoType( {this.id, this.name, - this.rate, - this.weight, - this.calWeight, - this.calRate, + this.rate = 0, + this.weight = 0, + this.calWeight = 0, + this.calRate = 0, this.isChecked = false, this.qty = 0, this.isCutomDuty, - this.customDutyFee}); + this.customDutyFee = 0}); factory CargoType.fromMap(Map map, String id) { return CargoType( @@ -52,7 +52,7 @@ class CargoType { } CargoType clone() { - return CargoType.fromMap(toMap(), this.id); + return CargoType.fromMap(toMap(), this.id!); } @override @@ -63,7 +63,7 @@ class CargoType { @override String toString() { - return name; + return name ?? ""; } bool isChangedForEdit(CargoType cargoType) { diff --git a/lib/domain/entities/carton.dart b/lib/domain/entities/carton.dart index 831adf2..22254ac 100644 --- a/lib/domain/entities/carton.dart +++ b/lib/domain/entities/carton.dart @@ -9,64 +9,64 @@ import 'cargo_type.dart'; import 'package.dart'; class Carton { - String id; - String shipmentID; - String shipmentNumber; - String senderID; - String senderFCSID; - String senderName; + String? id; + String? shipmentID; + String? shipmentNumber; + String? senderID; + String? senderFCSID; + String? senderName; - String boxNumber; - String status; - String cargoDesc; - String desc; + String? boxNumber; + String? status; + String? cargoDesc; + String? desc; double width; double height; double length; - int shipmentWeight; - bool isChecked; - bool isShipmentCarton; - String cartonType; - String fcsID; - String userName; - String userID; - String fcsShipmentID; - String fcsShipmentNumber; - String mixCartonID; - String mixCartonNumber; - String cartonSizeID; - String cartonSizeName; - double cartonWeight; + int? shipmentWeight; + bool? isChecked; + bool? isShipmentCarton; + String? cartonType; + String? fcsID; + String? userName; + String? userID; + String? fcsShipmentID; + String? fcsShipmentNumber; + String? mixCartonID; + String? mixCartonNumber; + String? cartonSizeID; + String? cartonSizeName; + double? cartonWeight; int rate; int weight; - String packageType; - String pickUpID; - List photos; - String remark; - DateTime arrivedDate; - String cartonNumber; + String? packageType; + String? pickUpID; + List photos = []; + String? remark; + DateTime? arrivedDate; + String? cartonNumber; List packageIDs; List packages; - List cargoTypes; + List cargoTypes = []; - DeliveryAddress deliveryAddress; - Shipment shipment; + DeliveryAddress? deliveryAddress; + Shipment? shipment; //for mix box - String mixBoxType; + String? mixBoxType; List mixCartons; List mixCartonIDs; - int get amount => rate != null && weight != null ? rate * weight : 0; + int get amount => rate != null && weight != null ? (rate * weight) : 0; // String get packageNumber => // shipmentNumber + "-" + receiverNumber + " #" + boxNumber; - double get price => rate.toDouble() * weight; - double get actualWeight => - cargoTypes == null ? 0 : cargoTypes.fold(0, (p, e) => e.weight + p); + double get actualWeight => cargoTypes == null + ? 0 + : cargoTypes.fold(0, (p, e) => e.weight + p); int getShipmentWeight(double volumetricRatio) { if (length == null || @@ -84,15 +84,15 @@ class Carton { /// getCargoTypeForCalWeight returns carton with shipment weight List getCargoTypeForCalWeight(double volumetricRatio) { // get shipment weight - double volume = (length ?? 0) * (width ?? 0) * (height ?? 0); - double sw = volume / volumetricRatio ?? 0; + double volume = length * width * height; + double sw = volume / volumetricRatio; // get actual weight double aw = cargoTypes.fold(0.0, (p, c) => p + c.weight); if (aw == 0 || sw == 0) return []; cargoTypes.forEach((e) { - double calWeight = aw > sw ? e.weight : e.weight / aw * sw; + double calWeight = aw > sw ? e.weight : (e.weight / aw) * sw; e.calWeight = calWeight; }); return cargoTypes; @@ -115,8 +115,8 @@ class Carton { double total = 0; cargoTypes.forEach((e) { - double r = - e.rate - (discountByWeight != null ? discountByWeight.discount : 0); + double r = e.rate - + (discountByWeight != null ? (discountByWeight.discount) : 0); double amount = e.weight * r; total += amount; }); @@ -134,9 +134,9 @@ class Carton { this.senderName, this.boxNumber, this.desc, - this.width, - this.height, - this.length, + this.width = 0, + this.height = 0, + this.length = 0, this.shipmentWeight, this.isChecked = false, this.cartonType, @@ -151,13 +151,13 @@ class Carton { this.status, this.arrivedDate, this.cargoDesc, - this.shipmentHistory, - this.packages, - this.cargoTypes, + this.shipmentHistory = const [], + this.packages = const [], + this.cargoTypes = const [], this.cartonNumber, this.fcsShipmentID, this.fcsShipmentNumber, - this.packageIDs, + this.packageIDs = const [], this.mixCartonID, this.mixCartonNumber, this.isShipmentCarton = false, @@ -165,14 +165,14 @@ class Carton { this.cartonSizeID, this.cartonSizeName, this.mixBoxType, - this.mixCartons, - this.mixCartonIDs, + this.mixCartons = const [], + this.mixCartonIDs = const [], this.cartonWeight}); Map toMap() { - List _cargoTypes = cargoTypes?.map((c) => c.toMap())?.toList() ?? []; - List _packages = packages?.map((c) => c.toJson())?.toList(); - List _mixCartons = mixCartons?.map((c) => c.toJson())?.toList(); + List _cargoTypes = cargoTypes.map((c) => c.toMap()).toList(); + List _packages = packages.map((c) => c.toJson()).toList(); + List _mixCartons = mixCartons.map((c) => c.toJson()).toList(); return { 'id': id, 'fcs_shipment_id': fcsShipmentID, @@ -213,9 +213,9 @@ class Carton { shipmentNumber: map['shipment_number'], // receiverNumber: map['receiver_number'], boxNumber: map['box_number'], - length: double.tryParse(map['length']?.toString()), - width: double.tryParse(map['width']?.toString()), - height: double.tryParse(map['height']?.toString()), + length: double.tryParse(map['length'].toString()) ?? 0, + width: double.tryParse(map['width'].toString()) ?? 0, + height: double.tryParse(map['height'].toString()) ?? 0, userName: map['user_name'], fcsID: map['fcs_id'], cartonType: map['carton_type'], @@ -242,8 +242,8 @@ class Carton { Map toJson() { List _cargoTypes = cargoTypes.map((c) => c.toMap()).toList(); - List _packages = packages?.map((c) => c.toJson())?.toList(); - List _mixCartons = mixCartons?.map((c) => c.toJson())?.toList(); + List _packages = packages.map((c) => c.toJson()).toList(); + List _mixCartons = mixCartons.map((c) => c.toJson()).toList(); return { 'id': id, 'fcs_shipment_id': fcsShipmentID, diff --git a/lib/domain/entities/carton_size.dart b/lib/domain/entities/carton_size.dart index 7d9f494..e9cd28b 100644 --- a/lib/domain/entities/carton_size.dart +++ b/lib/domain/entities/carton_size.dart @@ -1,10 +1,11 @@ class CartonSize { - String id; - String name; + String? id; + String? name; double length; double width; double height; - CartonSize({this.id, this.name, this.length, this.width, this.height}); + CartonSize( + {this.id, this.name, this.length = 0, this.width = 0, this.height = 0}); Map toMap() { return { @@ -27,19 +28,10 @@ class CartonSize { } @override - bool operator ==(other) { - if (identical(this, other)) { - return true; - } - return other.id == this.id; - } + bool operator ==(Object other) => other is CartonSize && other.id == id; @override - int get hashCode { - int result = 17; - result = 37 * result + id.hashCode; - return result; - } + int get hashCode => id.hashCode; bool isChangedForEdit(CartonSize cartonSize) { return cartonSize.name != this.name || diff --git a/lib/domain/entities/custom_duty.dart b/lib/domain/entities/custom_duty.dart index fb2a3aa..6f033f0 100644 --- a/lib/domain/entities/custom_duty.dart +++ b/lib/domain/entities/custom_duty.dart @@ -1,11 +1,15 @@ class CustomDuty { - String id; - String productType; - String desc; + String? id; + String? productType; + String? desc; double fee; double shipmentRate; CustomDuty( - {this.id, this.productType, this.desc, this.fee, this.shipmentRate}); + {this.id, + this.productType, + this.desc, + this.fee = 0, + this.shipmentRate = 0}); factory CustomDuty.fromMap(Map map, String id) { return CustomDuty( diff --git a/lib/domain/entities/customer.dart b/lib/domain/entities/customer.dart index 0fb51e7..6606f28 100644 --- a/lib/domain/entities/customer.dart +++ b/lib/domain/entities/customer.dart @@ -1,10 +1,8 @@ - - class Customer { - String id; - String name; - String phoneNumber; - String status; + String? id; + String? name; + String? phoneNumber; + String? status; Customer({ this.id, diff --git a/lib/domain/entities/discount.dart b/lib/domain/entities/discount.dart index cb2bda0..144bb9d 100644 --- a/lib/domain/entities/discount.dart +++ b/lib/domain/entities/discount.dart @@ -1,9 +1,9 @@ class Discount { - String id; - String code; - String customerId; - String customerName; - String status; + String? id; + String? code; + String? customerId; + String? customerName; + String? status; double amount; Discount({ @@ -11,7 +11,7 @@ class Discount { this.code, this.customerId, this.customerName, - this.amount, + this.amount = 0, this.status, }); diff --git a/lib/domain/entities/discount_by_weight.dart b/lib/domain/entities/discount_by_weight.dart index 3ff9a1d..92d46f0 100644 --- a/lib/domain/entities/discount_by_weight.dart +++ b/lib/domain/entities/discount_by_weight.dart @@ -1,9 +1,9 @@ class DiscountByWeight { - String id; + String? id; double weight; double discount; - DiscountByWeight({this.id, this.weight, this.discount}); + DiscountByWeight({this.id, this.weight = 0, this.discount = 0}); factory DiscountByWeight.fromMap(Map map, String id) { return DiscountByWeight( diff --git a/lib/domain/entities/faq.dart b/lib/domain/entities/faq.dart index fe20f07..7deae33 100644 --- a/lib/domain/entities/faq.dart +++ b/lib/domain/entities/faq.dart @@ -1,16 +1,17 @@ class FAQ { - String id; - int sn; - String questionEng; - String questionMm; - String answerEng; - String answerMm; - String pageLinkLabelEng; - String pageLinkLabelMm; - String pageLink; + String? id; + int? sn; + String? questionEng; + String? questionMm; + String? answerEng; + String? answerMm; + String? pageLinkLabelEng; + String? pageLinkLabelMm; + String? pageLink; - String question(bool isEng) => isEng ? questionEng : questionMm; - String answer(bool isEng) => isEng ? answerEng : answerMm; + String question(bool isEng) => + isEng ? (questionEng ?? "") : (questionMm ?? ""); + String answer(bool isEng) => isEng ? (answerEng ?? "") : (answerMm ?? ""); FAQ( {this.id, diff --git a/lib/domain/entities/fcs_shipment.dart b/lib/domain/entities/fcs_shipment.dart index 37e2c71..794e65e 100644 --- a/lib/domain/entities/fcs_shipment.dart +++ b/lib/domain/entities/fcs_shipment.dart @@ -3,17 +3,18 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import '../constants.dart'; class FcsShipment { - String id; - String shipmentNumber; - DateTime cutoffDate; - String shipType; - DateTime arrivalDate; - DateTime departureDate; - String consignee; - String port; - String destination; - String status; - String reportName; + String? id; + String? shipmentNumber; + DateTime? cutoffDate; + String? shipType; + DateTime? arrivalDate; + DateTime? departureDate; + String? consignee; + String? port; + String? destination; + String? status; + String? reportName; + FcsShipment({ this.id, this.shipmentNumber, @@ -51,10 +52,10 @@ class FcsShipment { return { "id": id, 'shipment_number': shipmentNumber, - 'cutoff_date': cutoffDate?.toUtc()?.toIso8601String(), + 'cutoff_date': cutoffDate?.toUtc().toIso8601String(), 'shipment_type': shipType, - 'arrival_date': arrivalDate?.toUtc()?.toIso8601String(), - 'departure_date': departureDate?.toUtc()?.toIso8601String(), + 'arrival_date': arrivalDate?.toUtc().toIso8601String(), + 'departure_date': departureDate?.toUtc().toIso8601String(), 'consignee': consignee, 'port': port, 'destination': destination, diff --git a/lib/domain/entities/invoice.dart b/lib/domain/entities/invoice.dart index b614fcc..a15e905 100644 --- a/lib/domain/entities/invoice.dart +++ b/lib/domain/entities/invoice.dart @@ -10,15 +10,15 @@ import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/domain/entities/shipment.dart'; class Invoice { - String id; - String invoiceNumber; - DateTime invoiceDate; - String fcsShipmentID; - String userID; - String fcsID; - String userName; - String phoneNumber; - String status; + String? id; + String? invoiceNumber; + DateTime? invoiceDate; + String? fcsShipmentID; + String? userID; + String? fcsID; + String? userName; + String? phoneNumber; + String? status; double handlingFee; double deliveryFee; @@ -28,11 +28,11 @@ class Invoice { List customDuties; List cartons; List cargoTypes; - List shipments; + List? shipments; List payments; - Discount discount; - PaymentMethod paymentMethod; - String invoiceURL; + Discount? discount; + PaymentMethod? paymentMethod; + String? invoiceURL; List getCargoTypes(Rate rate) { if (cargoTypes != null) return cargoTypes; @@ -40,7 +40,7 @@ class Invoice { List _cargoTypes = []; double totalCalWeight = 0; cartons.forEach((carton) { - if (carton.isChecked) { + if (carton.isChecked ?? false) { var _cartonsTypes = carton.getCargoTypeForCalWeight(rate.volumetricRatio); _cartonsTypes.forEach((ct) { @@ -68,15 +68,15 @@ class Invoice { double getTotal(Rate rate) { List cargoTypes = getCargoTypes(rate); - var total = cargoTypes.fold(0.0, (p, c) => c.calAmount + p); + double total = cargoTypes.fold(0.0, (p, c) => c.calAmount + p); return total; } - double get balance => (amount ?? 0) - (paidAmount ?? 0); + double get balance => amount - paidAmount; double getNetAmount(Rate rate) { List cargoTypes = getCargoTypes(rate); - var total = cargoTypes.fold(0.0, (p, c) => c.calAmount + p); + double total = cargoTypes.fold(0.0, (p, c) => c.calAmount + p); total += getCustomFee(); total += getDeliveryFee(); total += getHandlingFee(); @@ -85,13 +85,13 @@ class Invoice { } double getHandlingFee() { - return shipments?.where((sh) => sh.isSelected ?? false)?.fold(0, (p, s) { - return p + (s?.handlingFee ?? 0) - (s?.paidHandlingFee ?? 0); - }); + return shipments! + .where((sh) => sh!.isSelected) + .fold(0, (p, s) => p + (s!.handlingFee - s.paidHandlingFee)); } double getTotalBalance(Rate rate) { - return getNetAmount(rate) - (paidAmount ?? 0); + return getNetAmount(rate) - paidAmount; } double getCustomFee() { @@ -102,7 +102,7 @@ class Invoice { return deliveryFee == null ? 0 : deliveryFee; } - double getDiscount() => discount == null ? 0 : discount.amount; + double getDiscount() => discount == null ? 0 : discount!.amount; Invoice( {this.id, @@ -111,19 +111,19 @@ class Invoice { this.fcsID, this.userName, this.phoneNumber, - this.amount, - this.paidAmount, + this.amount = 0, + this.paidAmount = 0, this.discount, this.status, - this.customDuties, - this.cartons, - this.cargoTypes, - this.handlingFee, - this.deliveryFee, + this.customDuties = const [], + this.cartons = const [], + this.cargoTypes = const [], + this.handlingFee = 0, + this.deliveryFee = 0, this.fcsShipmentID, - this.shipments, + this.shipments = const [], this.invoiceURL, - this.payments, + this.payments = const [], this.paymentMethod}); factory Invoice.fromMap(Map map, String docID) { @@ -153,7 +153,7 @@ class Invoice { return Invoice( id: docID, invoiceNumber: map['invoice_number'], - invoiceDate: invd?.toDate(), + invoiceDate: invd.toDate(), userName: map['user_name'], fcsID: map['fcs_id'], phoneNumber: map['phone_number'], @@ -174,12 +174,12 @@ class Invoice { Map toMap() { List _cargoTypes = cargoTypes.map((c) => c.toMap()).toList(); - List _customDuties = customDuties?.map((c) => c.toMap())?.toList(); - List _cartons = cartons?.map((c) => c.toMap())?.toList() ?? []; - List _shipments = shipments?.map((s) => s.toMap())?.toList() ?? []; + List _customDuties = customDuties.map((c) => c.toMap()).toList(); + List _cartons = cartons.map((c) => c.toMap()).toList(); + List _shipments = shipments!.map((s) => s!.toMap()).toList(); return { "id": id, - "invoice_date": invoiceDate?.toUtc()?.toIso8601String(), + "invoice_date": invoiceDate?.toUtc().toIso8601String(), "user_id": userID, "user_name": userName, "invoice_number": invoiceNumber, diff --git a/lib/domain/entities/market.dart b/lib/domain/entities/market.dart index 0b7ebec..f12c955 100644 --- a/lib/domain/entities/market.dart +++ b/lib/domain/entities/market.dart @@ -1,11 +1,8 @@ class Market { - String id; - String name; + String? id; + String? name; - Market({ - this.id, - this.name, - }); + Market({this.id, this.name}); Map toMap() { return { diff --git a/lib/domain/entities/package.dart b/lib/domain/entities/package.dart index 9eb3249..2df0c7d 100644 --- a/lib/domain/entities/package.dart +++ b/lib/domain/entities/package.dart @@ -5,72 +5,71 @@ import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/domain/vo/shipment_status.dart'; class Package { - String id; - String trackingID; - String userID; - String fcsID; - String userName; - String phoneNumber; - DateTime currentStatusDate; + String? id; + String? trackingID; + String? userID; + String? fcsID; + String? userName; + String? phoneNumber; + DateTime? currentStatusDate; List photoUrls; List shipmentHistory; - String desc; + String? desc; - String status; - String shipmentNumber; - String senderFCSID; - String senderName; - String senderPhoneNumber; - String boxNumber; - String cargoDesc; - String market; + String? status; + String? shipmentNumber; + String? senderFCSID; + String? senderName; + String? senderPhoneNumber; + String? boxNumber; + String? cargoDesc; + String? market; bool isChecked; int rate; int weight; - String packageType; - String pickUpID; - List photos; - String remark; - DateTime arrivedDate; - DeliveryAddress deliveryAddress; + String? packageType; + String? pickUpID; + // List photos; + String? remark; + DateTime? arrivedDate; + DeliveryAddress? deliveryAddress; //for packages in processing - List photoFiles; + List photoFiles; int get amount => rate != null && weight != null ? rate * weight : 0; double get price => rate.toDouble() * weight; - Package({ - this.id, - this.trackingID, - this.userID, - this.userName, - this.fcsID, - this.phoneNumber, - this.shipmentNumber, - this.senderFCSID, - this.senderName, - this.boxNumber, - this.rate, - this.weight, - this.packageType, - this.pickUpID, - this.remark, - this.status, - this.arrivedDate, - this.cargoDesc, - this.market, - this.shipmentHistory, - this.currentStatusDate, - this.photoUrls, - this.desc, - this.deliveryAddress, - this.isChecked = false, - this.photoFiles, - this.senderPhoneNumber - }); + Package( + {this.id, + this.trackingID, + this.userID, + this.userName, + this.fcsID, + this.phoneNumber, + this.shipmentNumber, + this.senderFCSID, + this.senderName, + this.boxNumber, + this.rate = 0, + this.weight = 0, + this.packageType, + this.pickUpID, + this.remark, + this.status, + this.arrivedDate, + this.cargoDesc, + this.market, + this.shipmentHistory = const [], + this.currentStatusDate, + this.photoUrls = const [], + this.desc, + this.deliveryAddress, + this.isChecked = false, + this.photoFiles = const [], + this.senderPhoneNumber}); factory Package.fromMap(Map map, String docID) { var _currentStatusDate = (map['status_date'] as Timestamp); @@ -98,9 +97,7 @@ class Package { senderName: map['sender_name'], senderPhoneNumber: map['sender_phone_number'], deliveryAddress: _da, - currentStatusDate: _currentStatusDate != null - ? _currentStatusDate.toDate().toLocal() - : null, + currentStatusDate: _currentStatusDate.toDate().toLocal(), photoUrls: _photoUrls, shipmentHistory: _shipmentStatus); } diff --git a/lib/domain/entities/payment.dart b/lib/domain/entities/payment.dart index d30eebc..feaeaca 100644 --- a/lib/domain/entities/payment.dart +++ b/lib/domain/entities/payment.dart @@ -1,11 +1,11 @@ import 'package:cloud_firestore/cloud_firestore.dart'; class Payment { - String id; - String invoiceID; - DateTime paymentDate; - String paymentReceiptURL; - String status; + String? id; + String? invoiceID; + DateTime? paymentDate; + String? paymentReceiptURL; + String? status; double amount; Payment( @@ -14,13 +14,13 @@ class Payment { this.paymentDate, this.paymentReceiptURL, this.status, - this.amount}); + this.amount = 0}); factory Payment.fromMap(Map map, String id) { var _paymentDate = (map['payment_date'] as Timestamp); return Payment( id: id, - paymentDate: _paymentDate?.toDate(), + paymentDate: _paymentDate.toDate(), paymentReceiptURL: map['payment_receipt_url'], status: map['status'], amount: map['amount']?.toDouble() ?? 0, @@ -31,7 +31,7 @@ class Payment { return { "id": id, "invoice_id": invoiceID, - 'payment_date': paymentDate?.toUtc()?.toIso8601String(), + 'payment_date': paymentDate?.toUtc().toIso8601String(), 'payment_receipt_url': paymentReceiptURL, 'status': status, 'amount': amount, @@ -39,7 +39,7 @@ class Payment { } Payment clone() { - return Payment.fromMap(toMap(), this.id); + return Payment.fromMap(toMap(), this.id!); } @override diff --git a/lib/domain/entities/payment_method.dart b/lib/domain/entities/payment_method.dart index 50cf277..109ad16 100644 --- a/lib/domain/entities/payment_method.dart +++ b/lib/domain/entities/payment_method.dart @@ -1,11 +1,11 @@ class PaymentMethod { - String id; - String name; - String accountName; - String account; - String phone; - String email; - String link; + String? id; + String? name; + String? accountName; + String? account; + String? phone; + String? email; + String? link; PaymentMethod( {this.id, diff --git a/lib/domain/entities/processing.dart b/lib/domain/entities/processing.dart index 0006183..0c1a165 100644 --- a/lib/domain/entities/processing.dart +++ b/lib/domain/entities/processing.dart @@ -1,15 +1,15 @@ import 'package:fcs/domain/entities/package.dart'; class Processing { - String id; + String? id; //for consignee - String userID; - String userName; - String userPhoneNumber; + String? userID; + String? userName; + String? userPhoneNumber; //for shipper - String fcsID; - String shipperName; - String shipperPhoneNumber; + String? fcsID; + String? shipperName; + String? shipperPhoneNumber; List packages; @@ -21,7 +21,7 @@ class Processing { this.fcsID, this.shipperName, this.shipperPhoneNumber, - this.packages}); + this.packages = const []}); @override bool operator ==(Object other) => other is Processing && other.id == id; diff --git a/lib/domain/entities/rate.dart b/lib/domain/entities/rate.dart index f5682e1..54442e8 100644 --- a/lib/domain/entities/rate.dart +++ b/lib/domain/entities/rate.dart @@ -1,4 +1,3 @@ - import 'package:fcs/domain/entities/discount_by_weight.dart'; import 'cargo_type.dart'; @@ -11,26 +10,23 @@ class Rate { double diffDiscountWeight; double diffWeightRate; - List cargoTypes; - List customDuties; - List discountByWeights; + List cargoTypes = []; + List customDuties = []; + List discountByWeights = []; DiscountByWeight getDiscountByWeight(double weight) { discountByWeights.sort((d1, d2) => d2.weight.compareTo(d1.weight)); - return discountByWeights.firstWhere((e) => e.weight < weight, - orElse: () => null); + return discountByWeights.firstWhere((e) => e.weight < weight); } - CargoType get defaultCargoType => cargoTypes == null - ? null - : cargoTypes.firstWhere((e) => e.name == "General"); + CargoType get defaultCargoType => cargoTypes.firstWhere((e) => e.name == "General"); Rate( - {this.deliveryFee, - this.freeDeliveryWeight, - this.volumetricRatio, - this.diffDiscountWeight, - this.diffWeightRate}); + {this.deliveryFee = 0, + this.freeDeliveryWeight = 0, + this.volumetricRatio = 0, + this.diffDiscountWeight = 0, + this.diffWeightRate = 0}); factory Rate.fromMap(Map map) { return Rate( diff --git a/lib/domain/entities/receipt.dart b/lib/domain/entities/receipt.dart index 6fffbbe..70f59f5 100644 --- a/lib/domain/entities/receipt.dart +++ b/lib/domain/entities/receipt.dart @@ -1,9 +1,9 @@ class Receipt { - String id; - int amount; - String date; - String status; - String fileUrl; + String? id; + int? amount = 0; + String? date; + String? status; + String? fileUrl; Receipt({this.id, this.amount, this.date, this.status, this.fileUrl}); } diff --git a/lib/domain/entities/setting.dart b/lib/domain/entities/setting.dart index 8f594bb..dd85745 100644 --- a/lib/domain/entities/setting.dart +++ b/lib/domain/entities/setting.dart @@ -10,25 +10,24 @@ List dayLists = [ class Setting { final int supportBuildNum; - // contact page - String usaAddress; - String mmAddress; - String usaContactNumber; - String mmContactNumber; - String emailAddress; - String facebookLink; - bool inviteRequired; - String appUrl; - final String termsEng; - final String termsMm; - String about; - String courierWebsite; + String? usaAddress; + String? mmAddress; + String? usaContactNumber; + String? mmContactNumber; + String? emailAddress; + String? facebookLink; + bool? inviteRequired; + String? appUrl; + final String? termsEng; + final String? termsMm; + String? about; + String? courierWebsite; List shipmentTypes; Setting( - {this.supportBuildNum, + {this.supportBuildNum = 1, this.usaAddress, this.mmAddress, this.usaContactNumber, @@ -40,7 +39,7 @@ class Setting { this.termsEng, this.termsMm, this.about, - this.shipmentTypes, + this.shipmentTypes = const [], this.courierWebsite}); factory Setting.fromMap(Map map) { @@ -76,9 +75,9 @@ class Setting { } class Day { - int id; - String name; - bool isChecked = false; + int? id; + String? name; + bool? isChecked = false; Day({this.id, this.name, this.isChecked}); @override diff --git a/lib/domain/entities/shipment.dart b/lib/domain/entities/shipment.dart index 7b837df..2d4cabc 100644 --- a/lib/domain/entities/shipment.dart +++ b/lib/domain/entities/shipment.dart @@ -4,35 +4,35 @@ import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; class Shipment { - String id; - String shipmentNumber; - String shipmentType; - DeliveryAddress pickupAddress; - DateTime pickupDate; - String pickupTimeStart; - String pickupTimeEnd; + String? id; + String? shipmentNumber; + String? shipmentType; + DeliveryAddress? pickupAddress; + DateTime? pickupDate; + String? pickupTimeStart; + String? pickupTimeEnd; - String userName; - String userID; - String phoneNumber; - int numberOfPackage; - int weight; - double handlingFee; - double paidHandlingFee; - String address; - String status; + String? userName; + String? userID; + String? phoneNumber; + int numberOfPackage = 0; + int weight = 0; + double handlingFee = 0; + double paidHandlingFee = 0; + String? address; + String? status; bool isCourier; int radioIndex; List boxes; - String pickupUserID; - String pickupUserName; - String pickupUserPhoneNumber; + String? pickupUserID; + String? pickupUserName; + String? pickupUserPhoneNumber; - String fcsShipmentID; - String fcsShipmentNumber; - String shipmentLabelUrl; - bool isSelected; + String? fcsShipmentID; + String? fcsShipmentNumber; + String? shipmentLabelUrl; + bool isSelected = false; Shipment( {this.id, @@ -43,28 +43,28 @@ class Shipment { this.phoneNumber, this.pickupTimeStart, this.pickupTimeEnd, - this.numberOfPackage, - this.weight, - this.handlingFee, - this.paidHandlingFee, + this.numberOfPackage = 0, + this.weight = 0, + this.handlingFee = 0, + this.paidHandlingFee = 0, this.address, this.status, this.pickupDate, this.isCourier = false, this.radioIndex = 1, - this.pickupAddress, + required this.pickupAddress, this.pickupUserID, this.pickupUserName, this.pickupUserPhoneNumber, this.fcsShipmentID, this.fcsShipmentNumber, this.shipmentLabelUrl, - this.boxes}); + this.boxes = const []}); - int get last => DateTime.now().difference(pickupDate).inDays; + // int get last => DateTime.now().difference(pickupDate).inDays; - double get totalWeight => boxes?.fold(0, (p, e) => p + e.actualWeight); - int get totalCount => boxes?.length; + double get totalWeight => boxes.fold(0, (p, e) => p + e.actualWeight); + int get totalCount => boxes.length; bool get isPending => status == shipment_pending_status; bool get isAssigned => status == shipment_assigned_status; @@ -100,15 +100,15 @@ class Shipment { } Map toMap() { - List _boxes = boxes?.map((l) => l.toMap())?.toList() ?? []; + List _boxes = boxes.map((l) => l.toMap()).toList(); return { "id": id, 'user_id': userID, 'cartons': _boxes, 'shipment_type': shipmentType, - 'pickup_address': pickupAddress.toMap(), - "pickup_date": pickupDate?.toUtc()?.toIso8601String(), + 'pickup_address': pickupAddress?.toMap(), + "pickup_date": pickupDate?.toUtc().toIso8601String(), 'pickup_time_start': pickupTimeStart, 'pickup_time_end': pickupTimeEnd, 'pickup_user_id': pickupUserID, diff --git a/lib/domain/entities/user.dart b/lib/domain/entities/user.dart index 6ada508..0ad4100 100644 --- a/lib/domain/entities/user.dart +++ b/lib/domain/entities/user.dart @@ -9,18 +9,19 @@ DateFormat timeFormat = DateFormat("HH:mm"); final DateFormat dateFormat = DateFormat("d MMM yyyy"); class User { - String id; - String name; - String phoneNumber; - String status; - String fcsID; - DateTime lastMessageTime; - String lastMessage; + String? id; + String? name; + String? phoneNumber; + String? status; + String? fcsID; + DateTime? lastMessageTime; + String? lastMessage; int userUnseenCount; int fcsUnseenCount; - String preferCurrency; + String? preferCurrency; - String get initial => name != null && name != "" ? name.substring(0, 1) : "?"; + String get initial => + name != null && name != "" ? name!.substring(0, 1) : "?"; String get getLastMessage { var msg = lastMessage ?? "Say hi to $name"; @@ -31,27 +32,31 @@ class User { String get getLastMessageTime { if (lastMessageTime == null) return ""; DateTime today = DateTime.now(); - if (lastMessageTime.year == today.year && - lastMessageTime.month == today.month && - lastMessageTime.day == today.day) { - return timeFormat.format(lastMessageTime); + if (lastMessageTime!.year == today.year && + lastMessageTime!.month == today.month && + lastMessageTime!.day == today.day) { + return timeFormat.format(lastMessageTime!); } else { - return dateFormat.format(lastMessageTime); + return dateFormat.format(lastMessageTime!); } } String get getUserUnseenCount => userUnseenCount != null - ? userUnseenCount > 100 ? "99+" : userUnseenCount.toString() + ? userUnseenCount > 100 + ? "99+" + : userUnseenCount.toString() : "0"; String get getFcsUnseenCount => fcsUnseenCount != null - ? fcsUnseenCount > 100 ? "99+" : fcsUnseenCount.toString() + ? fcsUnseenCount > 100 + ? "99+" + : fcsUnseenCount.toString() : "0"; List privileges = []; - String get phone => phoneNumber != null && phoneNumber.startsWith("959") - ? "0${phoneNumber.substring(2)}" - : phoneNumber; + String get phone => phoneNumber != null && phoneNumber!.startsWith("959") + ? "0${phoneNumber!.substring(2)}" + : phoneNumber!; bool get joined => status != null && status == user_joined_status; bool get invited => status != null && status == user_invited_status; bool get requested => status != null && status == user_requested_status; @@ -64,11 +69,11 @@ class User { this.phoneNumber, this.fcsID, this.status, - this.privileges, + this.privileges = const [], this.lastMessage, this.lastMessageTime, - this.userUnseenCount, - this.fcsUnseenCount, + this.userUnseenCount = 0, + this.fcsUnseenCount = 0, this.preferCurrency}); factory User.fromJson(Map json) { diff --git a/lib/domain/exceiptions/server_exceptions.dart b/lib/domain/exceiptions/server_exceptions.dart index a76ba67..7436d0b 100644 --- a/lib/domain/exceiptions/server_exceptions.dart +++ b/lib/domain/exceiptions/server_exceptions.dart @@ -1,12 +1,12 @@ class ServerException { @override - List get props => null; + List? get props => null; call() { return null; } @override - bool get stringify => null; + bool? get stringify => null; } diff --git a/lib/domain/vo/contact.dart b/lib/domain/vo/contact.dart index 5df67a2..2037ddf 100644 --- a/lib/domain/vo/contact.dart +++ b/lib/domain/vo/contact.dart @@ -1,12 +1,12 @@ import 'package:fcs/domain/entities/setting.dart'; class Contact { - String usaAddress; - String mmAddress; - String usaContactNumber; - String mmContactNumber; - String emailAddress; - String facebookLink; + String? usaAddress; + String? mmAddress; + String? usaContactNumber; + String? mmContactNumber; + String? emailAddress; + String? facebookLink; Contact({ this.usaAddress, diff --git a/lib/domain/vo/delivery_address.dart b/lib/domain/vo/delivery_address.dart index 93e7960..b212ebc 100644 --- a/lib/domain/vo/delivery_address.dart +++ b/lib/domain/vo/delivery_address.dart @@ -1,13 +1,14 @@ class DeliveryAddress { - String id; - String fullName; - String addressLine1; - String addressLine2; - String city; - String state; - String phoneNumber; + String? id; + String? fullName; + String? addressLine1; + String? addressLine2; + String? city; + String? state; + String? phoneNumber; bool isDefault; - String userID; + String? userID; + DeliveryAddress( {this.id, this.fullName, diff --git a/lib/domain/vo/message.dart b/lib/domain/vo/message.dart index fc86b58..3417058 100644 --- a/lib/domain/vo/message.dart +++ b/lib/domain/vo/message.dart @@ -1,15 +1,15 @@ import 'package:cloud_firestore/cloud_firestore.dart'; class Message { - String id; - String message; - DateTime date; - String receiverID; - String receiverName; - String senderID; - String senderName; - String messageType; - String messageID; + String? id; + String? message; + DateTime? date; + String? receiverID; + String? receiverName; + String? senderID; + String? senderName; + String? messageType; + String? messageID; Message( {this.id, @@ -21,11 +21,13 @@ class Message { this.senderName, this.messageType, this.messageID}); + bool fromToday() { + if (date == null) return false; var now = DateTime.now(); - return date.day == now.day && - date.month == now.month && - date.year == now.year; + return date!.day == now.day && + date!.month == now.month && + date!.year == now.year; } Map toMap() { @@ -36,9 +38,10 @@ class Message { } bool sameDay(Message another) { - return date.year == another.date.year && - date.month == another.date.month && - date.day == another.date.day; + if (date == null) return false; + return date!.year == another.date!.year && + date!.month == another.date!.month && + date!.day == another.date!.day; } factory Message.fromMap(Map map, String id) { @@ -52,7 +55,7 @@ class Message { receiverName: map['receiver_name'], messageType: map['msg_type'], messageID: map['msg_id'], - date: date != null ? date.toDate() : null, + date: date.toDate(), ); } } diff --git a/lib/domain/vo/privilege.dart b/lib/domain/vo/privilege.dart index 5b913b2..85907a2 100644 --- a/lib/domain/vo/privilege.dart +++ b/lib/domain/vo/privilege.dart @@ -1,20 +1,24 @@ import 'package:fcs/domain/constants.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; class Privilege { String id; - String name; - String desc; - bool sysAdminOnly = true; - bool isChecked = false; + String? name; + String? desc; + bool? sysAdminOnly = true; + bool? isChecked = false; - IconData iconData; + IconData? iconData; Privilege( - {this.id, this.name, this.desc, this.isChecked, this.sysAdminOnly}) { + {required this.id, + this.name, + this.desc, + this.isChecked, + this.sysAdminOnly}) { if (this.id == privilege_admin) { iconData = MaterialCommunityIcons.account_tie; } else if (this.id == privilege_support) { diff --git a/lib/domain/vo/radio.dart b/lib/domain/vo/radio.dart deleted file mode 100644 index ab1a7a1..0000000 --- a/lib/domain/vo/radio.dart +++ /dev/null @@ -1,5 +0,0 @@ -class RadioGroup { - String text; - int index; - RadioGroup({this.text, this.index}); -} \ No newline at end of file diff --git a/lib/domain/vo/shipment_status.dart b/lib/domain/vo/shipment_status.dart index ed4549c..7783190 100644 --- a/lib/domain/vo/shipment_status.dart +++ b/lib/domain/vo/shipment_status.dart @@ -3,17 +3,21 @@ import 'package:cloud_firestore/cloud_firestore.dart'; class ShipmentStatus { String status; DateTime date; - bool done; - String staffId; - String staffName; + bool? done; + String? staffId; + String? staffName; ShipmentStatus( - {this.status, this.date, this.done, this.staffId, this.staffName}); + {required this.status, + required this.date, + this.done, + this.staffId, + this.staffName}); factory ShipmentStatus.fromMap(Map map) { var _date = (map['date'] as Timestamp); return ShipmentStatus( status: map['status'], - date: _date == null ? null : _date.toDate(), + date: _date.toDate(), done: map['done'], staffId: map['staff_id'], staffName: map['staff_name']); diff --git a/lib/domain/vo/status.dart b/lib/domain/vo/status.dart index e229726..a8b5b7b 100644 --- a/lib/domain/vo/status.dart +++ b/lib/domain/vo/status.dart @@ -1,8 +1,7 @@ - class Status { - String status; - String message; - String errorCode; + String? status; + String? message; + String? errorCode; Status(this.status, this.message); Status.fromJson(Map json) { @@ -10,4 +9,4 @@ class Status { message = json['message']; errorCode = json['error_code']; } -} \ No newline at end of file +} diff --git a/lib/domain/vo/term.dart b/lib/domain/vo/term.dart index b9c1086..9aa2c26 100644 --- a/lib/domain/vo/term.dart +++ b/lib/domain/vo/term.dart @@ -1,8 +1,8 @@ import 'package:fcs/domain/entities/setting.dart'; class Term { - String termEng; - String termMm; + String? termEng; + String? termMm; Term({this.termEng, this.termMm}); diff --git a/lib/helpers/api_helper.dart b/lib/helpers/api_helper.dart index 06fca69..8eacdd2 100644 --- a/lib/helpers/api_helper.dart +++ b/lib/helpers/api_helper.dart @@ -20,8 +20,8 @@ Future requestAPI( String path, method, { dynamic payload, - String token, - String url, + String? token, + String? url, }) async { DevInfo devInfo = await DevInfo.getDevInfo(); @@ -33,7 +33,7 @@ Future requestAPI( headers["Token"] = token; } if (devInfo != null && devInfo.deviceID != null && deviceName != null) { - headers["Device"] = devInfo.deviceID + ":" + deviceName; + headers["Device"] = devInfo.deviceID??"" + ":" + deviceName; } headers["Project-ID"] = Config.instance.reportProjectID; @@ -66,7 +66,7 @@ Future requestAPI( // request makes http request // if token is null Future requestDownloadAPI(String path, method, - {dynamic payload, String token, String url, String filePath}) async { + {dynamic payload, String? token, String? url, String? filePath}) async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; String deviceName = "${androidInfo.model}(${androidInfo.id})"; @@ -81,7 +81,7 @@ Future requestDownloadAPI(String path, method, log.info("Path:$baseUrl$path"); HttpClient client = new HttpClient(); var _downloadData = StringBuffer(); - var fileSave = new File(filePath); + var fileSave = new File(filePath!); var request = await client.getUrl(Uri.parse("$baseUrl$path")); request.headers.set("Project-ID", Config.instance.reportProjectID); request.headers @@ -108,7 +108,7 @@ Future requestDownloadAPI(String path, method, // request makes http request // if token is null Future requestDownloadPDFAPI(String path, method, - {dynamic payload, String token, String url, String filePath}) async { + {dynamic payload, String? token, String? url, String? filePath}) async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; String deviceName = "${androidInfo.model}(${androidInfo.id})"; @@ -123,7 +123,7 @@ Future requestDownloadPDFAPI(String path, method, log.info("Path:$baseUrl$path"); HttpClient client = new HttpClient(); // var _downloadData = StringBuffer(); - var fileSave = new File(filePath); + var fileSave = new File(filePath!); var request = await client.getUrl(Uri.parse("$baseUrl$path")); request.headers.set("Project-ID", Config.instance.reportProjectID); if (token != null) { @@ -135,7 +135,7 @@ Future requestDownloadPDFAPI(String path, method, request.headers.set("payload", escapePayload); var response = await request.close(); print("headers:${response.headers}"); - var _downloadData = List(); + List _downloadData = []; response.listen((d) => _downloadData.addAll(d), onDone: () { fileSave.writeAsBytes(_downloadData); @@ -155,10 +155,10 @@ typedef OnDownloadDone(File file); // if token is null Future requestDownload(String path, method, {dynamic payload, - String token, - String url, - String filePath, - OnDownloadDone onDownloadDone}) async { + required String token, + required String url, + required String filePath, + OnDownloadDone? onDownloadDone}) async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; String deviceName = "${androidInfo.model}(${androidInfo.id})"; @@ -188,7 +188,7 @@ Future requestDownload(String path, method, // request.write(escapePayload); var response = await request.close(); print("headers:${response.headers}"); - var _downloadData = List(); + List _downloadData = []; var cd = response.headers.value("content-disposition"); String fileName = "download.csv"; if (cd != null && cd.contains("filename=")) { diff --git a/lib/helpers/dev_info.dart b/lib/helpers/dev_info.dart index 255bf92..2d2c72d 100644 --- a/lib/helpers/dev_info.dart +++ b/lib/helpers/dev_info.dart @@ -2,13 +2,13 @@ import 'package:device_info/device_info.dart'; import 'dart:io' show Platform; class DevInfo { - bool isAndroid; - bool isIOS; - String deviceID; - String id; - String model; + bool? isAndroid; + bool? isIOS; + String? deviceID; + String? id; + String? model; - static DevInfo _instance; + static DevInfo? _instance; static Future getDevInfo() async { if (_instance != null) return Future.value(_instance); @@ -18,14 +18,14 @@ class DevInfo { if (Platform.isAndroid) { AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; - _instance.deviceID = androidInfo.androidId; - _instance.id = androidInfo.id; - _instance.model = androidInfo.model; + _instance!.deviceID = androidInfo.androidId; + _instance!.id = androidInfo.id; + _instance!.model = androidInfo.model; } else if (Platform.isIOS) { IosDeviceInfo iosDeviceInfo = await deviceInfo.iosInfo; - _instance.deviceID = iosDeviceInfo.identifierForVendor; - _instance.id = iosDeviceInfo.utsname.release; - _instance.model = iosDeviceInfo.model; + _instance!.deviceID = iosDeviceInfo.identifierForVendor; + _instance!.id = iosDeviceInfo.utsname.release; + _instance!.model = iosDeviceInfo.model; } return Future.value(_instance); } diff --git a/lib/helpers/firebase_helper.dart b/lib/helpers/firebase_helper.dart index f9539e8..4014aa8 100644 --- a/lib/helpers/firebase_helper.dart +++ b/lib/helpers/firebase_helper.dart @@ -1,71 +1,82 @@ import 'dart:io'; -import 'package:fcs/config.dart'; -import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth/firebase_auth.dart' as fb; import 'package:firebase_storage/firebase_storage.dart'; import 'package:logging/logging.dart'; import 'package:uuid/uuid.dart'; final log = Logger('firebaseHelper'); -final FirebaseAuth auth = FirebaseAuth.instance; +final fb.FirebaseAuth auth = fb.FirebaseAuth.instance; Future getToken() async { - FirebaseUser firebaseUser = await auth.currentUser(); - IdTokenResult token = await firebaseUser.getIdToken(); - return token.token; + fb.User? firebaseUser = fb.FirebaseAuth.instance.currentUser; + String token = await firebaseUser?.getIdToken() ?? ""; + return token; } -Future getClaims({bool refreshIdToken = false}) async { - FirebaseUser firebaseUser = await auth.currentUser(); +Future getClaims({bool refreshIdToken = false}) async { + fb.User? firebaseUser = auth.currentUser; if (firebaseUser == null) return null; - IdTokenResult idToken = - await firebaseUser.getIdToken(refresh: refreshIdToken); + fb.IdTokenResult idToken = + await firebaseUser.getIdTokenResult(refreshIdToken); return idToken.claims; } // returns list of url -Future> uploadFiles(String path, List files, - {String fileName}) async { +Future> uploadFiles(String path, List files, + {String? fileName}) async { List> fu = []; - for (File f in files) { + for (File? f in files) { Future u = uploadStorage(path, f); fu.add(u); } return Future.wait(fu); } -Future uploadStorage(String path, File file, {String fileName}) async { +Future uploadStorage(String path, File? file, + {String? fileName}) async { if (fileName == null) { fileName = Uuid().v4(); } - StorageReference storageReference = - FirebaseStorage(storageBucket: Config.instance.bucketName) - .ref() - .child('$path/$fileName'); - StorageUploadTask uploadTask = storageReference.putFile(file); - await uploadTask.onComplete; - String downloadUrl = await storageReference.getDownloadURL(); - print("name:${await storageReference.getName()}"); - print("bucket:${await storageReference.getBucket()}"); - print("path:${await storageReference.getPath()}"); - print("meta:${await storageReference.getMetadata()}"); + if (file == null) { + return Future.value(''); + } + Reference ref = FirebaseStorage.instance.ref().child('$path/$fileName'); + UploadTask uploadTask = ref.putFile(file); + await uploadTask.resume(); + String downloadUrl = await ref.getDownloadURL(); return downloadUrl; + // StorageReference storageReference = + // FirebaseStorage(storageBucket: Config.instance.bucketName) + // .ref() + // .child('$path/$fileName'); + // StorageUploadTask uploadTask = storageReference.putFile(file); + // await uploadTask.onComplete; + // String downloadUrl = await storageReference.getDownloadURL(); + // print("name:${await storageReference.getName()}"); + // print("bucket:${await storageReference.getBucket()}"); + // print("path:${await storageReference.getPath()}"); + // print("meta:${await storageReference.getMetadata()}"); + // return downloadUrl; } -Future deleteStorageFromUrls(List urls) async { +Future deleteStorageFromUrls(List urls) async { if (urls == null) return; for (int i = 0; i < urls.length; i++) { - await deleteStorageFromUrl(urls[i]); + if (urls[i] == null) return; + await deleteStorageFromUrl(urls[i]!); } } Future deleteStorageFromUrl(String url) async { try { - StorageReference storageReference = - await FirebaseStorage(storageBucket: Config.instance.bucketName) - .getReferenceFromUrl(url); - await storageReference.delete(); + Reference ref = FirebaseStorage.instance.refFromURL(url); + await ref.delete(); + // StorageReference storageReference = + // await FirebaseStorage(storageBucket: Config.instance.bucketName) + // .getReferenceFromUrl(url); + // await storageReference.delete(); } catch (e) { log.warning("deleteStorage:$e"); } diff --git a/lib/helpers/network_connectivity.dart b/lib/helpers/network_connectivity.dart index fe7c21d..4a7932d 100644 --- a/lib/helpers/network_connectivity.dart +++ b/lib/helpers/network_connectivity.dart @@ -11,7 +11,7 @@ class NetworkConnectivity { final log = Logger('NetworkConnectivity'); static final NetworkConnectivity instance = NetworkConnectivity._internal(); - static String hostName; + static String? hostName; NetworkConnectivity._internal() { _initialise(); var uri = Uri.parse(Config.instance.apiURL); @@ -38,7 +38,7 @@ class NetworkConnectivity { // lookup if connectivity is not none if (result != ConnectivityResult.none) { try { - final hostNameLookup = await InternetAddress.lookup(hostName); + final hostNameLookup = await InternetAddress.lookup(hostName ?? ""); if (hostNameLookup.isNotEmpty && hostNameLookup[0].rawAddress.isNotEmpty) { if (await checkHeartbeat()) { diff --git a/lib/helpers/paginator.dart b/lib/helpers/paginator.dart index cb89f15..240a8e3 100644 --- a/lib/helpers/paginator.dart +++ b/lib/helpers/paginator.dart @@ -13,7 +13,7 @@ class Paginator { final log = Logger('Paginator'); final int rowPerLoad; - DocumentSnapshot prev; + DocumentSnapshot? prev; bool ended = false; bool isLoading = false; List values = []; @@ -21,7 +21,7 @@ class Paginator { Query pageQuery; - Paginator(this.pageQuery, {this.rowPerLoad = 20, this.toObj}) { + Paginator(this.pageQuery, {this.rowPerLoad = 20, required this.toObj}) { _clearState(); } @@ -36,27 +36,27 @@ class Paginator { _clearState(); } - Future refresh({CallBack onFinished}) async { + Future refresh({CallBack? onFinished}) async { _clearState(); await load(); if (onFinished != null) onFinished(); } - Future load({CallBack onFinished}) async { + Future load({CallBack? onFinished}) async { if (ended) return null; isLoading = true; Query _query = - prev != null ? pageQuery.startAfterDocument(prev) : pageQuery; + prev != null ? pageQuery.startAfterDocument(prev!) : pageQuery; try { await _query .limit(rowPerLoad) - .getDocuments(source: Source.server) + .get(GetOptions(source: Source.server)) .then((QuerySnapshot snapshot) { - int count = snapshot.documents.length; + int count = snapshot.docs.length; ended = count < rowPerLoad; - prev = count > 0 ? snapshot.documents[count - 1] : prev; - snapshot.documents.forEach((e) { - values.add(toObj(e.data, e.documentID)); + prev = count > 0 ? snapshot.docs[count - 1] : prev; + snapshot.docs.forEach((e) { + values.add(toObj(e.data() as Map, e.id)); }); }); } catch (e) { diff --git a/lib/helpers/shared_pref.dart b/lib/helpers/shared_pref.dart index d2f26f8..e020232 100644 --- a/lib/helpers/shared_pref.dart +++ b/lib/helpers/shared_pref.dart @@ -7,17 +7,17 @@ class SharedPref { static final SharedPref instance = SharedPref._(); SharedPref._(); - static Future isFirstLaunch() async { + static Future isFirstLaunch() async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getBool('first_launch'); } static Future finishFirstLaunch() async { SharedPreferences prefs = await SharedPreferences.getInstance(); - return prefs.setBool('first_launch', false); + prefs.setBool('first_launch', false); } - static Future getLang() async { + static Future getLang() async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getString('language'); } @@ -27,7 +27,7 @@ class SharedPref { prefs.setString('language', lang); } - static Future getStaffMode() async { + static Future getStaffMode() async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getBool('staff_mode_on'); } @@ -41,7 +41,7 @@ class SharedPref { await _save("user", user.toJson()); } - static Future getUser() async { + static Future getUser() async { try { return User.fromJson(await _read("user")); } catch (e) { @@ -57,7 +57,7 @@ class SharedPref { await _save("skipped_recovery_email", skipped); } - static Future getSkippedRecoverEmail() async { + static Future getSkippedRecoverEmail() async { try { bool _skipped = await _read("skipped_recovery_email"); return _skipped; @@ -69,7 +69,7 @@ class SharedPref { static _read(String key) async { try { final prefs = await SharedPreferences.getInstance(); - return json.decode(prefs.getString(key)); + return json.decode(prefs.getString(key) ?? ""); } catch (e) { print("Error:$e"); } diff --git a/lib/helpers/theme.dart b/lib/helpers/theme.dart index e029208..e3ec100 100644 --- a/lib/helpers/theme.dart +++ b/lib/helpers/theme.dart @@ -20,8 +20,10 @@ const TextStyle labelStyleMM = TextStyle( fontFamily: "Myanmar3"); const TextStyle subMenuStyle = TextStyle(fontSize: 14, color: Colors.white, fontWeight: FontWeight.w500); -const TextStyle subMenuStyleMM = - TextStyle(fontSize: 14, color: Colors.white, fontWeight: FontWeight.w500, +const TextStyle subMenuStyleMM = TextStyle( + fontSize: 14, + color: Colors.white, + fontWeight: FontWeight.w500, fontFamily: "Myanmar3"); const TextStyle welcomeLabelStyle = @@ -31,11 +33,10 @@ const TextStyle welcomeSubLabelStyle = const TextStyle siginButtonStyle = TextStyle(fontSize: 16, color: Colors.white, fontWeight: FontWeight.w500); - TextStyle newLabelStyle( - {Color color, - double fontSize, - FontWeight fontWeight, + {Color? color, + double? fontSize, + FontWeight? fontWeight, bool underline = false}) { return TextStyle( fontSize: fontSize == null ? 14 : fontSize, @@ -45,9 +46,9 @@ TextStyle newLabelStyle( } TextStyle newLabelStyleMM( - {Color color, - double fontSize, - FontWeight fontWeight, + {Color? color, + double? fontSize, + FontWeight? fontWeight, bool underline = false}) { return TextStyle( fontSize: fontSize == null ? 13 : fontSize, @@ -59,8 +60,8 @@ TextStyle newLabelStyleMM( const TextStyle photoLabelStyle = TextStyle(color: Colors.black, fontSize: 13.0); -const TextStyle photoLabelStyleMM = TextStyle( - color: Colors.black, fontSize: 13.0, fontFamily: "Myanmar3"); +const TextStyle photoLabelStyleMM = + TextStyle(color: Colors.black, fontSize: 13.0, fontFamily: "Myanmar3"); const TextStyle textStyle = TextStyle(fontSize: 14, color: Colors.black87, fontWeight: FontWeight.w500); const TextStyle textStyleOdd = TextStyle( diff --git a/lib/localization/app_translations.dart b/lib/localization/app_translations.dart index 0c8cc59..f578c5a 100644 --- a/lib/localization/app_translations.dart +++ b/lib/localization/app_translations.dart @@ -6,14 +6,14 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show rootBundle; class AppTranslations { - Locale locale; - static Map _localisedValues; + late Locale locale; + static late Map _localisedValues; AppTranslations(Locale locale) { this.locale = locale; } - static AppTranslations of(BuildContext context) { + static AppTranslations? of(BuildContext context) { return Localizations.of(context, AppTranslations); } @@ -27,7 +27,7 @@ class AppTranslations { get currentLanguage => locale.languageCode; - String text(String key, {List translationVariables}) { + String text(String key, {List? translationVariables}) { String value = _localisedValues[key]; if (value == null) { return "$key not found"; diff --git a/lib/localization/app_translations_delegate.dart b/lib/localization/app_translations_delegate.dart index 010d1ac..c90f302 100644 --- a/lib/localization/app_translations_delegate.dart +++ b/lib/localization/app_translations_delegate.dart @@ -15,7 +15,7 @@ class AppTranslationsDelegate extends LocalizationsDelegate { @override Future load(Locale locale) { - return AppTranslations.load(newLocale ?? locale); + return AppTranslations.load(newLocale); } @override diff --git a/lib/localization/transalation.dart b/lib/localization/transalation.dart index 634ae80..8a548b9 100644 --- a/lib/localization/transalation.dart +++ b/lib/localization/transalation.dart @@ -23,5 +23,5 @@ class Translation { supportedLanguagesCodes.map((language) => Locale(language, "")); //function to be invoked when changing the language - LocaleChangeCallback? onLocaleChanged; + late LocaleChangeCallback onLocaleChanged; } diff --git a/lib/pages/buying_instruction/buying_online.dart b/lib/pages/buying_instruction/buying_online.dart index fc7efce..fbd8b53 100644 --- a/lib/pages/buying_instruction/buying_online.dart +++ b/lib/pages/buying_instruction/buying_online.dart @@ -1,6 +1,5 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/model/main_model.dart'; -import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/fcs_id_icon.dart'; import 'package:fcs/pages/widgets/local_text.dart'; @@ -15,7 +14,7 @@ class BuyingOnlinePage extends StatefulWidget { class _BuyingOnlinePagetate extends State with SingleTickerProviderStateMixin { - TabController _tabController; + late TabController _tabController; @override void initState() { @@ -28,22 +27,22 @@ class _BuyingOnlinePagetate extends State MainModel mainModel = Provider.of(context); final phoneNumberBox = DisplayText( - text: mainModel.user.phone, + text: mainModel.user?.phone, labelTextKey: "contact.phone", iconData: Icons.location_on, ); final nameBox = Center( child: Text( - mainModel.user.name, + mainModel.user?.name ?? "", style: TextStyle(fontSize: 18, color: primaryColor), )); final fcsIdBox = DisplayText( - text: mainModel.user.fcsID, + text: mainModel.user?.fcsID, labelTextKey: "customer.fcs.id", icon: FcsIDIcon(), ); final shippingAddressBox = DisplayText( - text: mainModel.setting.usaAddress, + text: mainModel.setting?.usaAddress, labelTextKey: "profile.usa.shipping.address", iconData: Icons.location_on, ); diff --git a/lib/pages/carton/cargo_table.dart b/lib/pages/carton/cargo_table.dart index 1abdf9c..9266868 100644 --- a/lib/pages/carton/cargo_table.dart +++ b/lib/pages/carton/cargo_table.dart @@ -6,10 +6,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class CargoTable extends StatefulWidget { - final List cargoTypes; + final List? cargoTypes; const CargoTable({ - Key key, + Key? key, this.cargoTypes, }) : super(key: key); @@ -58,13 +58,13 @@ class _CargoTableState extends State { return []; } double total = 0; - var rows = widget.cargoTypes.map((c) { + var rows = widget.cargoTypes!.map((c) { total += c.weight; return MyDataRow( onSelectChanged: (bool selected) async {}, cells: [ MyDataCell(new Text( - c.name == null ? "" : c.name, + c.name ?? "", style: textStyle, )), MyDataCell(c.qty == null || c.qty == 0 diff --git a/lib/pages/carton/cargo_type_addtion.dart b/lib/pages/carton/cargo_type_addtion.dart index 9cf3e11..0201e9b 100644 --- a/lib/pages/carton/cargo_type_addtion.dart +++ b/lib/pages/carton/cargo_type_addtion.dart @@ -35,7 +35,7 @@ class _CargoTypeAdditionState extends State { p.isChecked = false; p.isCutomDuty = false; p.weight = 0; - p.qty = null; + p.qty = 0; }); specialCargos.forEach((p) { p.isChecked = false; @@ -69,12 +69,12 @@ class _CargoTypeAdditionState extends State { Checkbox( value: c.isChecked, activeColor: primaryColor, - onChanged: (bool check) { + onChanged: (bool? check) { setState(() { - c.isChecked = check; + c.isChecked = check ?? false; }); }), - new Text(c.name, style: textStyle), + new Text(c.name ?? '', style: textStyle), ], ), ), diff --git a/lib/pages/carton/cargo_type_editor.dart b/lib/pages/carton/cargo_type_editor.dart index fb6376b..1d6572c 100644 --- a/lib/pages/carton/cargo_type_editor.dart +++ b/lib/pages/carton/cargo_type_editor.dart @@ -12,7 +12,7 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; class CargoTypeEditor extends StatefulWidget { - final CargoType cargo; + final CargoType? cargo; CargoTypeEditor({this.cargo}); @override @@ -23,14 +23,14 @@ class _CargoTypeEditorState extends State { TextEditingController _weightController = new TextEditingController(); bool _isLoading = false; - CargoType _cargo; + CargoType? _cargo; @override void initState() { super.initState(); if (widget.cargo != null) { _cargo = widget.cargo; - _weightController.text = _cargo.weight.toStringAsFixed(2); + _weightController.text = _cargo!.weight.toStringAsFixed(2); } else { _loadDefalut(); } @@ -67,7 +67,7 @@ class _CargoTypeEditorState extends State { }, labelKey: "cargo.type", iconData: Icons.text_format, - selectedValue: _cargo, + selectedValue: _cargo!, values: cargos, ); @@ -75,7 +75,7 @@ class _CargoTypeEditorState extends State { context, getLocalString(context, 'box.cargo.save.btn'), callack: () { - _cargo.weight = double.tryParse(_weightController.text) ?? 0; + _cargo!.weight = double.tryParse(_weightController.text) ?? 0; Navigator.pop(context, _cargo); }, ); diff --git a/lib/pages/carton/carton_cargo_table.dart b/lib/pages/carton/carton_cargo_table.dart index d67eda5..cd02930 100644 --- a/lib/pages/carton/carton_cargo_table.dart +++ b/lib/pages/carton/carton_cargo_table.dart @@ -11,13 +11,13 @@ typedef OnRemove(CargoType cargoType); typedef OnUpdate(CargoType cargoType); class CargoTable extends StatefulWidget { - final List cargoTypes; - final bool isNew; - final OnRemove onRemove; - final OnUpdate onUpdate; + final List? cargoTypes; + final bool? isNew; + final OnRemove? onRemove; + final OnUpdate? onUpdate; const CargoTable( - {Key key, this.cargoTypes, this.isNew, this.onRemove, this.onUpdate}) + {Key? key, this.cargoTypes, this.isNew, this.onRemove, this.onUpdate}) : super(key: key); @override @@ -26,14 +26,14 @@ class CargoTable extends StatefulWidget { class _CargoTableState extends State { double totalWeight = 0; - List cargoTypes; + List? cargoTypes; @override void initState() { cargoTypes = widget.cargoTypes; - if (!widget.isNew) { + if (!widget.isNew!) { totalWeight = - cargoTypes.fold(0, (previous, current) => previous + current.weight); + cargoTypes!.fold(0, (previous, current) => previous + current.weight); } super.initState(); @@ -41,8 +41,8 @@ class _CargoTableState extends State { @override Widget build(BuildContext context) { - print("Cargotypes:${cargoTypes.length}"); - + print("Cargotypes:${cargoTypes!.length}"); + return SingleChildScrollView( scrollDirection: Axis.horizontal, child: MyDataTable( @@ -80,18 +80,18 @@ class _CargoTableState extends State { if (cargoTypes == null) { return []; } - var rows = cargoTypes.map((c) { + var rows = cargoTypes!.map((c) { return MyDataRow( onSelectChanged: (bool selected) async {}, cells: [ MyDataCell( new Text( - c.name == null ? "" : c.name, + c.name ?? '', style: textStyle, ), ), MyDataCell( - c.isCutomDuty + c.isCutomDuty! ? GestureDetector( onTap: () async { String _t = await showDialog( @@ -103,7 +103,7 @@ class _CargoTableState extends State { setState(() { c.qty = int.tryParse(_t) ?? 0; }); - if (widget.onUpdate != null) widget.onUpdate(c); + if (widget.onUpdate != null) widget.onUpdate!(c); }, child: Center( child: Container( @@ -153,7 +153,7 @@ class _CargoTableState extends State { if (c.weight != 0) { _cal(); } - if (widget.onUpdate != null) widget.onUpdate(c); + if (widget.onUpdate != null) widget.onUpdate!(c); }, child: Container( padding: const EdgeInsets.all(7.0), @@ -176,7 +176,7 @@ class _CargoTableState extends State { color: primaryColor, ), onPressed: () { - if (widget.onRemove != null) widget.onRemove(c); + if (widget.onRemove != null) widget.onRemove!(c); }) ], ), @@ -237,26 +237,25 @@ class _CargoTableState extends State { } _cal() { - var cargoType = autoCalWeight(cargoTypes, totalWeight); + var cargoType = autoCalWeight(cargoTypes!, totalWeight); if (cargoType == null) return; setState(() { - cargoTypes.remove(cargoType); - cargoTypes.add(cargoType); + cargoTypes!.remove(cargoType); + cargoTypes!.add(cargoType); }); if (widget.onUpdate != null) { - widget.onUpdate(cargoType); + widget.onUpdate!(cargoType); } } } -CargoType autoCalWeight(List cargoTypes, double total) { - if ((cargoTypes?.length ?? 0) == 0 || total == 0) return null; +CargoType? autoCalWeight(List cargoTypes, double total) { List noWeight = cargoTypes.where((c) => c.weight == 0).toList(); if (noWeight.length != 1) return null; - var _existing = + double _existing = cargoTypes.fold(0, (previous, current) => previous + current.weight); noWeight[0].weight = total - _existing; diff --git a/lib/pages/carton/carton_cargo_table_old.dart b/lib/pages/carton/carton_cargo_table_old.dart index 8e0d6f9..05378f2 100644 --- a/lib/pages/carton/carton_cargo_table_old.dart +++ b/lib/pages/carton/carton_cargo_table_old.dart @@ -1,23 +1,21 @@ import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/my_data_table.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'cargo_type_editor.dart'; import 'total_weight_edit.dart'; typedef OnAdd(CargoType cargoType); typedef OnRemove(CargoType cargoType); class CargoTable extends StatefulWidget { - final List cargoTypes; - final OnAdd onAdd; - final OnRemove onRemove; + final List? cargoTypes; + final OnAdd? onAdd; + final OnRemove? onRemove; - const CargoTable({Key key, this.cargoTypes, this.onAdd, this.onRemove}) + const CargoTable({Key? key, this.cargoTypes, this.onAdd, this.onRemove}) : super(key: key); @override @@ -67,7 +65,7 @@ class _CargoTableState extends State { List _types = []; double _total = 0; - var rows = widget.cargoTypes.map((c) { + var rows = widget.cargoTypes!.map((c) { _total += c.weight; return MyDataRow( onSelectChanged: (bool selected) async {}, @@ -75,7 +73,7 @@ class _CargoTableState extends State { MyDataCell(Row( children: [ new Text( - c.name == null ? "" : c.name, + c.name ?? "", style: textStyle, ), new Text( @@ -99,7 +97,7 @@ class _CargoTableState extends State { color: primaryColor, ), onPressed: () { - if (widget.onRemove != null) widget.onRemove(c); + if (widget.onRemove != null) widget.onRemove!(c); }) ], ), @@ -127,7 +125,7 @@ class _CargoTableState extends State { alignment: Alignment.centerRight, child: InkWell( onTap: () async { - double _t = await Navigator.of(context).push( + double? _t = await Navigator.of(context).push( CupertinoPageRoute( builder: (context) => TotalWeightEdit(totalWeight: totalWeight))); @@ -135,21 +133,21 @@ class _CargoTableState extends State { setState(() { totalWeight = _t; this.remainingWeight = this.totalWeight - _total; - widget.cargoTypes.forEach((c) { + widget.cargoTypes!.forEach((c) { if (c.qty == null) { this._cargos.add(c); } }); this._cargos.forEach((c) { - _list.add(c.name); + _list.add(c.name!); }); - widget.cargoTypes.forEach((c) { - _types.add(c.name); + widget.cargoTypes!.forEach((c) { + _types.add(c.name!); }); - if (this._cargos.length == widget.cargoTypes.length - 1) { + if (this._cargos.length == widget.cargoTypes!.length - 1) { _types.forEach((t) { if (!_list.contains(t)) { - widget.cargoTypes.forEach((c) { + widget.cargoTypes!.forEach((c) { if (c.name == t) { c.weight = this.remainingWeight; } diff --git a/lib/pages/carton/carton_editor.dart b/lib/pages/carton/carton_editor.dart index e366bc3..e83d6b1 100644 --- a/lib/pages/carton/carton_editor.dart +++ b/lib/pages/carton/carton_editor.dart @@ -29,7 +29,7 @@ import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; import 'cargo_type_addtion.dart'; import 'carton_cargo_table.dart'; @@ -40,7 +40,7 @@ import 'package_carton_editor.dart'; import 'widgets.dart'; class CartonEditor extends StatefulWidget { - final Carton box; + final Carton? box; CartonEditor({this.box}); @override @@ -51,32 +51,32 @@ class _CartonEditorState extends State { TextEditingController _widthController = new TextEditingController(); TextEditingController _heightController = new TextEditingController(); TextEditingController _lengthController = new TextEditingController(); - DeliveryAddress _deliveryAddress = new DeliveryAddress(); + DeliveryAddress? _deliveryAddress = new DeliveryAddress(); List _cargoTypes = []; - Carton _carton; + Carton? _carton; bool _isLoading = false; - bool _isNew; - User _user; - String _selectedCartonType; + bool _isNew = false; + User? _user; + String? _selectedCartonType; double volumetricRatio = 0; double shipmentWeight = 0; - FcsShipment _fcsShipment; - List _fcsShipments; + FcsShipment? _fcsShipment; + List? _fcsShipments; List _cartons = []; - CartonSize selectedCatonSize; + CartonSize? selectedCatonSize; //for mix carton List _mixCartons = []; - String _selectedMixBoxType; + String? _selectedMixBoxType; //for carton from cargos - User consignee; - User sender; + User? consignee; + User? sender; List _cartonsFromCartons = []; - double totalWeight; + double? totalWeight; @override void initState() { @@ -92,28 +92,28 @@ class _CartonEditorState extends State { if (widget.box != null) { _carton = widget.box; - _deliveryAddress = _carton.deliveryAddress; - _widthController.text = _carton.width.toString(); - _heightController.text = _carton.height.toString(); - _lengthController.text = _carton.length.toString(); - _selectedCartonType = _carton.cartonType; + _deliveryAddress = _carton!.deliveryAddress; + _widthController.text = _carton!.width.toString(); + _heightController.text = _carton!.height.toString(); + _lengthController.text = _carton!.length.toString(); + _selectedCartonType = _carton!.cartonType; - _cargoTypes = _carton.cargoTypes.map((e) => e.clone()).toList(); + _cargoTypes = _carton!.cargoTypes.map((e) => e.clone()).toList(); _isNew = false; _user = User( - id: _carton.userID, fcsID: _carton.fcsID, name: _carton.userName); + id: _carton!.userID, fcsID: _carton!.fcsID, name: _carton!.userName); consignee = User( - id: _carton.userID, fcsID: _carton.fcsID, name: _carton.userName); + id: _carton!.userID, fcsID: _carton!.fcsID, name: _carton!.userName); sender = User( - id: _carton.senderID, - fcsID: _carton.senderFCSID, - name: _carton.senderName); - _selectedMixBoxType = _carton.mixBoxType ?? ""; + id: _carton!.senderID, + fcsID: _carton!.senderFCSID, + name: _carton!.senderName); + _selectedMixBoxType = _carton!.mixBoxType; this._mixCartons = - _carton.mixCartons == null ? [] : List.from(_carton.mixCartons); - bool isMixBox = _carton.cartonType == carton_mix_box; - bool isFromPackages = _carton.cartonType == carton_from_packages; + _carton!.mixCartons == null ? [] : List.from(_carton!.mixCartons); + bool isMixBox = _carton!.cartonType == carton_mix_box; + bool isFromPackages = _carton!.cartonType == carton_from_packages; if (isFromPackages) _loadPackages(); if (!isMixBox) { @@ -138,8 +138,8 @@ class _CartonEditorState extends State { FcsShipmentModel fcsShipmentModel = Provider.of(context, listen: false); var fcsShipments = await fcsShipmentModel.getActiveFcsShipments(); - var fcsShipment = fcsShipments - .firstWhere((e) => e.id == _carton.fcsShipmentID, orElse: () => null); + var fcsShipment = + fcsShipments.firstWhere((e) => e.id == _carton!.fcsShipmentID); setState(() { _fcsShipments = fcsShipments; _fcsShipment = fcsShipment; @@ -151,9 +151,9 @@ class _CartonEditorState extends State { PackageModel packageModel = Provider.of(context, listen: false); List packages = await packageModel.getPackages( - _user.id, [package_processed_status, package_packed_status]); + _user!.id!, [package_processed_status, package_packed_status]); if (_isNew) { - String prevCompare; + String? prevCompare; packages.forEach((p) { String compare = (p.deliveryAddress?.fullName ?? "") + (p.deliveryAddress?.phoneNumber ?? ""); @@ -169,8 +169,8 @@ class _CartonEditorState extends State { }); } else { packages.forEach((p) { - if (_carton.packages.contains(p)) { - p.isChecked = _carton.packages.firstWhere((cp) => cp == p).isChecked; + if (_carton!.packages.contains(p)) { + p.isChecked = _carton!.packages.firstWhere((cp) => cp == p).isChecked; } else { p.isChecked = false; } @@ -178,7 +178,7 @@ class _CartonEditorState extends State { } setState(() { - _carton.packages = packages; + _carton!.packages = packages; }); // _populateDeliveryAddress(); } @@ -195,9 +195,9 @@ class _CartonEditorState extends State { // } _calShipmentWeight() { - double l = double.parse(_lengthController.text, (s) => 0); - double w = double.parse(_widthController.text, (s) => 0); - double h = double.parse(_heightController.text, (s) => 0); + double l = double.parse(_lengthController.text); + double w = double.parse(_widthController.text); + double h = double.parse(_heightController.text); setState(() { shipmentWeight = l * w * h / volumetricRatio; }); @@ -206,9 +206,9 @@ class _CartonEditorState extends State { _getCartonSize() { var cartonSizeModel = Provider.of(context, listen: false); cartonSizeModel.cartonSizes.forEach((c) { - if (c.length == _carton.length && - c.width == _carton.width && - c.height == _carton.height) { + if (c.length == _carton!.length && + c.width == _carton!.width && + c.height == _carton!.height) { selectedCatonSize = CartonSize( id: c.id, name: c.name, @@ -232,7 +232,7 @@ class _CartonEditorState extends State { bool isMixBox = _selectedCartonType == carton_mix_box; final shipmentBox = DisplayText( - text: _carton.fcsShipmentNumber, + text: _carton!.fcsShipmentNumber, labelTextKey: "box.fcs_shipment_num", iconData: Ionicons.ios_airplane, ); @@ -248,8 +248,8 @@ class _CartonEditorState extends State { labelKey: "shipment.pack.fcs.shipment", iconData: Ionicons.ios_airplane, display: (u) => u.shipmentNumber, - selectedValue: _fcsShipment, - values: _fcsShipments, + selectedValue: _fcsShipment!, + values: _fcsShipments!, )); final fcsIDBox = Container( @@ -297,7 +297,7 @@ class _CartonEditorState extends State { readOnly: !_isNew, values: boxModel.cartonTypes, selectedValue: _selectedCartonType, - callback: (v) { + callback: (String? v) { setState(() { _selectedCartonType = v; }); @@ -337,7 +337,7 @@ class _CartonEditorState extends State { value: e, groupValue: _selectedMixBoxType, activeColor: primaryColor, - onChanged: (v) { + onChanged: (String? v) { setState(() { _selectedMixBoxType = v; }); @@ -407,7 +407,7 @@ class _CartonEditorState extends State { color: primaryColor, ), onPressed: () async { - List cargos = await Navigator.push>( + List? cargos = await Navigator.push>( context, CupertinoPageRoute(builder: (context) => CargoTypeAddition())); if (cargos == null) return; @@ -462,7 +462,7 @@ class _CartonEditorState extends State { children: [ Expanded( child: DisplayText( - text: consignee != null ? consignee.fcsID : "", + text: consignee != null ? consignee!.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), @@ -477,7 +477,7 @@ class _CartonEditorState extends State { ); final consigneeNameBox = DisplayText( - text: consignee != null ? consignee.name : "", + text: consignee != null ? consignee!.name : "", labelTextKey: "processing.consignee.name", maxLines: 2, iconData: Icons.person, @@ -496,7 +496,7 @@ class _CartonEditorState extends State { children: [ Expanded( child: DisplayText( - text: sender != null ? sender.fcsID : "", + text: sender != null ? sender!.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), @@ -511,7 +511,7 @@ class _CartonEditorState extends State { ); final shipperNamebox = DisplayText( - text: sender != null ? sender.name : "", + text: sender != null ? sender!.name : "", labelTextKey: "processing.shipper.name", maxLines: 2, iconData: Icons.person, @@ -551,7 +551,7 @@ class _CartonEditorState extends State { children: [ _isNew ? Container() - : Center(child: getCartonNumberStatus(context, _carton)), + : Center(child: getCartonNumberStatus(context, _carton!)), LocalTitle(textKey: "box.type.title"), cartonTypeBox, LocalTitle(textKey: "box.shipment_info"), @@ -572,7 +572,7 @@ class _CartonEditorState extends State { isFromPackages ? namebox : Container(), isFromPackages ? CartonPackageTable( - packages: _carton.packages, + packages: _carton!.packages, onSelect: (p, checked) { // if (checked && // _deliveryAddress != null && @@ -623,7 +623,7 @@ class _CartonEditorState extends State { deliveryAddress: _deliveryAddress, labelKey: "box.delivery_address", onTap: () async { - DeliveryAddress d = + DeliveryAddress? d = await Navigator.push( context, CupertinoPageRoute( @@ -631,8 +631,8 @@ class _CartonEditorState extends State { DeliveryAddressSelection( deliveryAddress: _deliveryAddress, user: User( - id: _carton.userID, - name: _carton.userName))), + id: _carton!.userID, + name: _carton!.userName))), ); if (d == null) return; setState(() { @@ -667,7 +667,7 @@ class _CartonEditorState extends State { bool isFromCartons = _selectedCartonType == carton_from_cartons; if (isFromPackages) { _loadPackages(); - c.value.packages = _carton.packages; + c.value.packages = _carton!.packages; Carton _c = await Navigator.push( context, CupertinoPageRoute( @@ -736,20 +736,20 @@ class _CartonEditorState extends State { height: 1, color: Colors.grey, ), - onChanged: (CartonSize newValue) { + onChanged: (CartonSize? newValue) { setState(() { - if (newValue.name == MANAGE_CARTONSIZE) { + if (newValue!.name == MANAGE_CARTONSIZE) { selectedCatonSize = null; _manageCartonSize(); return; } selectedCatonSize = newValue; _widthController.text = - selectedCatonSize.width.toString(); + selectedCatonSize!.width.toString(); _heightController.text = - selectedCatonSize.height.toString(); + selectedCatonSize!.height.toString(); _lengthController.text = - selectedCatonSize.length.toString(); + selectedCatonSize!.length.toString(); }); }, isExpanded: true, @@ -789,8 +789,7 @@ class _CartonEditorState extends State { _updateCargo(CargoType cargo) { setState(() { - var _c = - _cargoTypes.firstWhere((e) => e.id == cargo.id, orElse: () => null); + var _c = _cargoTypes.firstWhere((e) => e.id == cargo.id); if (_c != null) { _c.weight = cargo.weight; _c.qty = cargo.qty; @@ -827,30 +826,30 @@ class _CartonEditorState extends State { double h = double.parse(_heightController.text, (s) => 0); Carton carton = Carton(); - carton.id = _carton.id; - carton.cartonType = _selectedCartonType; - carton.fcsShipmentID = _isNew ? _fcsShipment.id : _carton.fcsShipmentID; + carton.id = _carton!.id; + carton.cartonType = _selectedCartonType!; + carton.fcsShipmentID = _isNew ? _fcsShipment!.id : _carton!.fcsShipmentID; if (isFromPackages) { - carton.userID = _user?.id; - carton.fcsID = _user?.fcsID; - carton.userName = _user?.name; - carton.packages = _carton.packages.where((e) => e.isChecked).toList(); + carton.userID = _user?.id ?? ''; + carton.fcsID = _user?.fcsID ?? ''; + carton.userName = _user?.name ?? ''; + carton.packages = _carton!.packages.where((e) => e.isChecked).toList(); } if (isFromCartons) { - carton.userID = consignee?.id; - carton.fcsID = consignee?.fcsID; - carton.userName = consignee?.name; - carton.senderID = sender?.id; - carton.senderFCSID = sender?.fcsID; - carton.senderName = sender?.name; + carton.userID = consignee?.id ?? ""; + carton.fcsID = consignee?.fcsID ?? ""; + carton.userName = consignee?.name ?? ""; + carton.senderID = sender?.id ?? ""; + carton.senderFCSID = sender?.fcsID ?? ""; + carton.senderName = sender?.name ?? ""; } - carton.cargoTypes = _carton.cargoTypes; + carton.cargoTypes = _carton!.cargoTypes; carton.length = l; carton.width = w; carton.height = h; - carton.deliveryAddress = _carton.deliveryAddress; + carton.deliveryAddress = _carton!.deliveryAddress; try { Carton _c = await Navigator.push( @@ -864,7 +863,7 @@ class _CartonEditorState extends State { ); if (_c == null) return; var cartonModel = Provider.of(context, listen: false); - Carton _carton = await cartonModel.getCarton(_c.id); + Carton _carton = await cartonModel.getCarton(_c.id ?? ""); if (isFromPackages) { _cartons.add(_carton); } @@ -898,15 +897,15 @@ class _CartonEditorState extends State { showMsgDialog(context, "Error", "Please select FCS shipment"); return; } - if ((this._mixCartons?.length ?? 0) == 0) { + if (this._mixCartons.length == 0) { showMsgDialog(context, "Error", "Expect at least one carton"); return; } Carton carton = Carton(); - carton.id = _carton.id; - carton.cartonType = _selectedCartonType; - carton.fcsShipmentID = _isNew ? _fcsShipment.id : _carton.fcsShipmentID; - carton.mixBoxType = _selectedMixBoxType; + carton.id = _carton!.id; + carton.cartonType = _selectedCartonType!; + carton.fcsShipmentID = _isNew ? _fcsShipment!.id : _carton!.fcsShipmentID; + carton.mixBoxType = _selectedMixBoxType!; carton.mixCartons = this._mixCartons; setState(() { _isLoading = true; @@ -932,7 +931,7 @@ class _CartonEditorState extends State { _save() async { bool isFromPackages = _selectedCartonType == carton_from_packages; bool isFromCartons = _selectedCartonType == carton_from_cartons; - if ((_cargoTypes?.length ?? 0) == 0 && (isFromPackages || isFromCartons)) { + if (_cargoTypes.length == 0 && (isFromPackages || isFromCartons)) { showMsgDialog(context, "Error", "Expect at least one cargo type"); return; } @@ -940,9 +939,9 @@ class _CartonEditorState extends State { showMsgDialog(context, "Error", "Invalid cargo weight"); return; } - double l = double.parse(_lengthController.text, (s) => 0); - double w = double.parse(_widthController.text, (s) => 0); - double h = double.parse(_heightController.text, (s) => 0); + double l = double.parse(_lengthController.text); + double w = double.parse(_widthController.text); + double h = double.parse(_heightController.text); if ((l <= 0 || w <= 0 || h <= 0) && (isFromPackages || isFromCartons)) { showMsgDialog(context, "Error", "Invalid dimension"); return; @@ -953,16 +952,16 @@ class _CartonEditorState extends State { } Carton carton = Carton(); - carton.id = _carton.id; - carton.cartonType = _selectedCartonType; - carton.fcsShipmentID = _isNew ? _fcsShipment.id : _carton.fcsShipmentID; + carton.id = _carton!.id; + carton.cartonType = _selectedCartonType!; + carton.fcsShipmentID = _isNew ? _fcsShipment!.id : _carton!.fcsShipmentID; if (isFromPackages) { - carton.userID = _user?.id; - carton.packages = _carton.packages.where((e) => e.isChecked).toList(); + carton.userID = _user?.id ?? ""; + carton.packages = _carton!.packages.where((e) => e.isChecked).toList(); } if (isFromCartons) { - carton.userID = consignee?.id; - carton.senderID = sender?.id; + carton.userID = consignee?.id ?? ""; + carton.senderID = sender?.id ?? ""; } carton.cargoTypes = _cargoTypes; diff --git a/lib/pages/carton/carton_info.dart b/lib/pages/carton/carton_info.dart index 522b548..68358c3 100644 --- a/lib/pages/carton/carton_info.dart +++ b/lib/pages/carton/carton_info.dart @@ -1,7 +1,5 @@ import 'package:fcs/domain/constants.dart'; -import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/carton.dart'; -import 'package:fcs/domain/entities/carton_size.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; @@ -19,7 +17,7 @@ import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -33,7 +31,7 @@ import 'widgets.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); class CartonInfo extends StatefulWidget { - final Carton box; + final Carton? box; CartonInfo({this.box}); @override @@ -42,22 +40,22 @@ class CartonInfo extends StatefulWidget { class _CartonInfoState extends State { bool _isLoading = false; - Carton _box; - DeliveryAddress _deliveryAddress = new DeliveryAddress(); + Carton? _box; + DeliveryAddress? _deliveryAddress = new DeliveryAddress(); TextEditingController _widthController = new TextEditingController(); TextEditingController _heightController = new TextEditingController(); TextEditingController _lengthController = new TextEditingController(); TextEditingController _cartonSizeController = new TextEditingController(); double volumetricRatio = 0; double shipmentWeight = 0; - String selectMixBoxType; + String? selectMixBoxType; - bool isMixBox; - bool isFromShipments; - bool isFromPackages; - bool isSmallBag; - bool isFromCartons; - bool isEdiable; + bool isMixBox = false; + bool isFromShipments = false; + bool isFromPackages = false; + bool isSmallBag = false; + bool isFromCartons = false; + bool isEdiable = false; @override void initState() { @@ -77,31 +75,31 @@ class _CartonInfoState extends State { } _updateBoxData() { - _widthController.text = _box.width.toString(); - _heightController.text = _box.height.toString(); - _lengthController.text = _box.length.toString(); - _cartonSizeController.text = _box.cartonSizeName ?? ""; - _deliveryAddress = _box.deliveryAddress; - isMixBox = _box.cartonType == carton_mix_box; - isFromShipments = _box.cartonType == carton_from_shipments; - isFromPackages = _box.cartonType == carton_from_packages; - isSmallBag = _box.cartonType == carton_small_bag; - isFromCartons = _box.cartonType == carton_from_cartons; + _widthController.text = _box!.width.toString(); + _heightController.text = _box!.height.toString(); + _lengthController.text = _box!.length.toString(); + _cartonSizeController.text = _box!.cartonSizeName ?? ""; + _deliveryAddress = _box!.deliveryAddress; + isMixBox = _box!.cartonType == carton_mix_box; + isFromShipments = _box!.cartonType == carton_from_shipments; + isFromPackages = _box!.cartonType == carton_from_packages; + isSmallBag = _box!.cartonType == carton_small_bag; + isFromCartons = _box!.cartonType == carton_from_cartons; isEdiable = (isFromPackages || isMixBox || isFromCartons) && - _box.status == carton_packed_status; - selectMixBoxType = _box.mixBoxType ?? ""; + _box!.status == carton_packed_status; + selectMixBoxType = _box!.mixBoxType; getCartonSize(); } getCartonSize() { var cartonSizeModel = Provider.of(context, listen: false); cartonSizeModel.cartonSizes.forEach((c) { - if (c.length == _box.length && - c.width == _box.width && - c.height == _box.height) { + if (c.length == _box!.length && + c.width == _box!.width && + c.height == _box!.height) { setState(() { - _cartonSizeController.text = c.name; + _cartonSizeController.text = c.name ?? ""; }); } }); @@ -110,43 +108,45 @@ class _CartonInfoState extends State { _loadPackages() async { if (!isFromPackages && !isSmallBag) return; - if (_box.cartonType == carton_from_packages && _box.userID == null) return; + if (_box!.cartonType == carton_from_packages && _box!.userID == null) + return; PackageModel packageModel = Provider.of(context, listen: false); - List packages = await packageModel.getPackages(_box.userID, [ + List packages = + await packageModel.getPackages(_box!.userID ?? "", [ package_processed_status, package_packed_status, package_shipped_status, package_delivered_status ]); - packages = packages.where((p) => _box.packageIDs.contains(p.id)).toList(); + packages = packages.where((p) => _box!.packageIDs.contains(p.id)).toList(); packages.forEach((p) { p.isChecked = true; }); setState(() { - _box.packages = packages; + _box!.packages = packages; }); } _loadMixCartons() async { - if (_box.cartonType != carton_mix_box) return; + if (_box!.cartonType != carton_mix_box) return; CartonModel cartonModel = Provider.of(context, listen: false); List catons = []; - for (var id in _box.mixCartonIDs) { + for (var id in _box!.mixCartonIDs) { Carton c = await cartonModel.getCarton(id); catons.add(c); } setState(() { - _box.mixCartons = catons; + _box!.mixCartons = catons; }); } _calShipmentWeight() { - double l = double.parse(_lengthController.text, (s) => 0); - double w = double.parse(_widthController.text, (s) => 0); - double h = double.parse(_heightController.text, (s) => 0); + double l = double.parse(_lengthController.text); + double w = double.parse(_widthController.text); + double h = double.parse(_heightController.text); setState(() { shipmentWeight = l * w * h / volumetricRatio; }); @@ -166,33 +166,34 @@ class _CartonInfoState extends State { final cartonTypeBox = LocalRadioButtons( readOnly: true, values: cartonModel.cartonTypesInfo, - selectedValue: - _box.isShipmentCarton ? carton_from_shipments : _box.cartonType); + selectedValue: (_box!.isShipmentCarton ?? false) + ? carton_from_shipments + : _box!.cartonType); final shipmentBox = DisplayText( - text: _box.fcsShipmentNumber, + text: _box!.fcsShipmentNumber, labelTextKey: "box.fcs_shipment_num", iconData: Ionicons.ios_airplane, ); final fcsIDBox = DisplayText( - text: _box.fcsID == null ? "" : _box.fcsID, + text: _box!.fcsID == null ? "" : _box!.fcsID, labelTextKey: "box.fcs.id", icon: FcsIDIcon(), ); final customerNameBox = DisplayText( - text: _box.userName == null ? "" : _box.userName, + text: _box!.userName == null ? "" : _box!.userName, labelTextKey: "box.name", iconData: Icons.person, ); final consigneefcsIDBox = DisplayText( - text: _box.fcsID != null ? _box.fcsID : "", + text: _box!.fcsID != null ? _box!.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), ); final consigneeNameBox = DisplayText( - text: _box.userName != null ? _box.userName : "", + text: _box!.userName != null ? _box!.userName : "", labelTextKey: "processing.consignee.name", maxLines: 2, iconData: Icons.person, @@ -211,7 +212,7 @@ class _CartonInfoState extends State { children: [ Expanded( child: DisplayText( - text: _box.senderFCSID != null ? _box.senderFCSID : "", + text: _box!.senderFCSID, labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), @@ -219,7 +220,7 @@ class _CartonInfoState extends State { ); final shipperNamebox = DisplayText( - text: _box.senderName != null ? _box.senderName : "", + text: _box!.senderName, labelTextKey: "processing.shipper.name", maxLines: 2, iconData: Icons.person, @@ -269,10 +270,10 @@ class _CartonInfoState extends State { iconData: AntDesign.CodeSandbox, ); final cargoTableBox = CargoTable( - cargoTypes: _box.cargoTypes, + cargoTypes: _box!.cargoTypes, ); final mixCartonNumberBox = DisplayText( - text: _box.mixCartonNumber, + text: _box!.mixCartonNumber, labelTextKey: "box.mix.carton", iconData: MaterialCommunityIcons.package, ); @@ -300,7 +301,7 @@ class _CartonInfoState extends State { color: primaryColor, ), ), - Text(selectMixBoxType) + Text(selectMixBoxType ?? "") ], ) ], @@ -340,7 +341,7 @@ class _CartonInfoState extends State { body: Padding( padding: const EdgeInsets.all(10.0), child: ListView(shrinkWrap: true, children: [ - Center(child: getCartonNumberStatus(context, _box)), + Center(child: getCartonNumberStatus(context, _box!)), LocalTitle(textKey: "box.type.title"), cartonTypeBox, LocalTitle(textKey: "box.shipment_info"), @@ -367,11 +368,11 @@ class _CartonInfoState extends State { isMixBox ? mixTypeBox : Container(), isMixBox ? LocalTitle(textKey: "box.mix_caton_title") : Container(), isMixBox - ? Column(children: _getCartons(context, _box.mixCartons)) + ? Column(children: _getCartons(context, _box!.mixCartons)) : Container(), isFromPackages || isSmallBag ? CartonPackageTable( - packages: _box.packages, + packages: _box!.packages, ) : Container(), isMixBox ? Container() : LocalTitle(textKey: "box.cargo.type"), @@ -408,14 +409,14 @@ class _CartonInfoState extends State { } _gotoEditor() async { - _box.mixCartons = _box.mixCartons; - bool updated = await Navigator.push( + _box!.mixCartons = _box!.mixCartons; + bool? updated = await Navigator.push( context, CupertinoPageRoute(builder: (context) => CartonEditor(box: _box)), ); if (updated ?? false) { var cartonModel = Provider.of(context, listen: false); - var c = await cartonModel.getCarton(widget.box.id); + var c = await cartonModel.getCarton(widget.box!.id ?? ""); setState(() { _box = c; _loadPackages(); @@ -437,7 +438,7 @@ class _CartonInfoState extends State { }); try { var cartonModel = Provider.of(context, listen: false); - await cartonModel.deleteCarton(widget.box); + await cartonModel.deleteCarton(widget.box!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/carton/carton_list_row.dart b/lib/pages/carton/carton_list_row.dart index 9c47368..8f61bb3 100644 --- a/lib/pages/carton/carton_list_row.dart +++ b/lib/pages/carton/carton_list_row.dart @@ -3,13 +3,13 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'carton_info.dart'; class CartonListRow extends StatelessWidget { final Carton box; - CartonListRow({Key key, this.box}) : super(key: key); + CartonListRow({Key? key, required this.box}) : super(key: key); final double dotSize = 15.0; final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); @@ -71,14 +71,14 @@ class CartonListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(0), - child: getStatus(box.status == null ? "" : box.status), + child: getStatus(box.status ?? ""), ), Padding( padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5), child: Row( children: [ new Text( - "${box.cartonWeight?.toStringAsFixed(2) ?? ''} lb", + "${box.cartonWeight?.toStringAsFixed(2)} lb", style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/carton/carton_mix_table.dart b/lib/pages/carton/carton_mix_table.dart index 86daa49..6d2cee4 100644 --- a/lib/pages/carton/carton_mix_table.dart +++ b/lib/pages/carton/carton_mix_table.dart @@ -8,10 +8,10 @@ import 'package:flutter/material.dart'; typedef OnSelect = Function(Carton carton, bool checked); class CartonMixTable extends StatelessWidget { - final List cartons; - final OnSelect onSelect; + final List? cartons; + final OnSelect? onSelect; - const CartonMixTable({Key key, this.cartons, this.onSelect}) + const CartonMixTable({Key? key, this.cartons, this.onSelect}) : super(key: key); @override @@ -32,21 +32,21 @@ class CartonMixTable extends StatelessWidget { ); final rows = cartons == null - ? [] - : cartons.asMap().entries.map((p) { + ? [Container()] + : cartons!.asMap().entries.map((p) { return Container( - color: p.value.isChecked + color: (p.value.isChecked ?? false) ? Colors.grey.withOpacity(0.2) - : Colors.grey[50].withOpacity(0.2), + : Colors.grey.shade50.withOpacity(0.2), child: Container( padding: EdgeInsets.only( left: 0.0, right: 10.0, top: 3.0, bottom: 3.0), decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: p.key == cartons.length - 1 + color: p.key == cartons!.length - 1 ? Colors.white - : Colors.grey[350], + : Colors.grey.shade300, width: 1), ), ), @@ -55,8 +55,8 @@ class CartonMixTable extends StatelessWidget { Checkbox( value: p.value.isChecked, activeColor: primaryColor, - onChanged: (bool check) { - if (onSelect != null) onSelect(p.value, check); + onChanged: (bool? check) { + if (onSelect != null) onSelect!(p.value, check!); }), Expanded( child: new Text( @@ -64,7 +64,7 @@ class CartonMixTable extends StatelessWidget { style: textStyle, )), new Text( - p.value?.actualWeight?.toString() ?? "", + p.value.actualWeight.toString(), style: textStyle, ), ], diff --git a/lib/pages/carton/carton_package_table.dart b/lib/pages/carton/carton_package_table.dart index 07eb9f3..7850efa 100644 --- a/lib/pages/carton/carton_package_table.dart +++ b/lib/pages/carton/carton_package_table.dart @@ -8,10 +8,10 @@ import 'package:flutter/material.dart'; typedef OnSelect = Function(Package package, bool checked); class CartonPackageTable extends StatelessWidget { - final List packages; - final OnSelect onSelect; + final List? packages; + final OnSelect? onSelect; - const CartonPackageTable({Key key, this.packages, this.onSelect}) + const CartonPackageTable({Key? key, this.packages, this.onSelect}) : super(key: key); @override @@ -34,20 +34,20 @@ class CartonPackageTable extends StatelessWidget { final rows = packages == null ? [Container()] - : packages.asMap().entries.map((p) { + : packages!.asMap().entries.map((p) { return Container( color: p.value.isChecked ? Colors.grey.withOpacity(0.2) - : Colors.grey[50].withOpacity(0.2), + : Colors.grey.shade50.withOpacity(0.2), child: Container( padding: EdgeInsets.only( left: 0.0, right: 10.0, top: 3.0, bottom: 3.0), decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: p.key == packages.length - 1 + color: p.key == packages!.length - 1 ? Colors.white - : Colors.grey[350], + : Colors.grey.shade300, width: 1), ), ), @@ -62,15 +62,15 @@ class CartonPackageTable extends StatelessWidget { : Checkbox( value: p.value.isChecked, activeColor: primaryColor, - onChanged: (bool check) { - if (onSelect != null) onSelect(p.value, check); + onChanged: (bool? check) { + if (onSelect != null) onSelect!(p.value, check!); }), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - p.value.trackingID, + p.value.trackingID ?? "", style: textStyle, ), Text( @@ -88,11 +88,11 @@ class CartonPackageTable extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( - p.value?.desc ?? "", + p.value.desc ?? "", style: textStyle, ), new Text( - "(${p.value?.market ?? ""})", + "(${p.value.market})", style: textStyle, ) ], diff --git a/lib/pages/carton/carton_row.dart b/lib/pages/carton/carton_row.dart index 0c8eb21..970a3a2 100644 --- a/lib/pages/carton/carton_row.dart +++ b/lib/pages/carton/carton_row.dart @@ -2,15 +2,15 @@ import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; typedef OnRemove(Carton carton); class CartonRow extends StatelessWidget { final Carton box; - final OnRemove onRemove; - CartonRow({Key key, this.box, this.onRemove}) : super(key: key); + final OnRemove? onRemove; + CartonRow({Key? key, required this.box, this.onRemove}) : super(key: key); final double dotSize = 15.0; final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); @@ -20,7 +20,7 @@ class CartonRow extends StatelessWidget { return Container( decoration: BoxDecoration( border: Border( - bottom: BorderSide(color: Colors.grey[300]), + bottom: BorderSide(color: Colors.grey.shade300), ), ), child: Row( @@ -75,7 +75,7 @@ class CartonRow extends StatelessWidget { color: primaryColor, ), onPressed: () { - if (onRemove != null) onRemove(box); + if (onRemove != null) onRemove!(box); }), box.actualWeight == 0 ? Container() @@ -84,7 +84,7 @@ class CartonRow extends StatelessWidget { child: Row( children: [ new Text( - "${box.actualWeight?.toStringAsFixed(2) ?? ''} lb", + "${box.actualWeight.toStringAsFixed(2)} lb", style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/carton/input_text_border.dart b/lib/pages/carton/input_text_border.dart index 58f2314..4c2eff7 100644 --- a/lib/pages/carton/input_text_border.dart +++ b/lib/pages/carton/input_text_border.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; typedef OnAdd(String value); class InputTextBorder extends StatelessWidget { - final OnAdd onAdd; - final TextEditingController controller; + final OnAdd? onAdd; + final TextEditingController? controller; - const InputTextBorder({Key key, this.onAdd, this.controller}) + const InputTextBorder({Key? key, this.onAdd, this.controller}) : super(key: key); @override Widget build(BuildContext context) { @@ -14,7 +14,7 @@ class InputTextBorder extends StatelessWidget { textAlign: TextAlign.center, controller: controller, onChanged: (v) { - if (onAdd != null) onAdd(v); + if (onAdd != null) onAdd!(v); }, keyboardType: TextInputType.number, decoration: new InputDecoration( diff --git a/lib/pages/carton/model/carton_model.dart b/lib/pages/carton/model/carton_model.dart index 24d3aeb..da5a7fb 100644 --- a/lib/pages/carton/model/carton_model.dart +++ b/lib/pages/carton/model/carton_model.dart @@ -3,9 +3,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/data/services/services.dart'; import 'package:fcs/domain/constants.dart'; -import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/carton.dart'; -import 'package:fcs/domain/vo/message.dart'; import 'package:fcs/domain/vo/shipment_status.dart'; import 'package:fcs/helpers/paginator.dart'; import 'package:fcs/pages/main/model/base_model.dart'; @@ -14,19 +12,20 @@ import 'package:logging/logging.dart'; class CartonModel extends BaseModel { List _boxes = []; - PaginatorListener cartonsByFilter; + late PaginatorListener cartonsByFilter; final log = Logger('CartonModel'); - List get boxes => - _selectedIndex == 1 ? _boxes : List.from(_delivered.values); + List get boxes => _selectedIndex == 1 + ? _boxes + : List.from(_delivered?.values ?? []); - Paginator _delivered; + Paginator? _delivered; int _selectedIndex = 1; int _selectedIndexFilter = 1; bool isLoading = false; - StreamSubscription listener; - StreamSubscription cartonListener; + StreamSubscription? listener; + StreamSubscription? cartonListener; static List statusHistory = [ ShipmentStatus(status: "Packed", date: DateTime(2020, 6, 1), done: true), ShipmentStatus(status: "Shipped", date: DateTime(2020, 6, 5), done: false), @@ -87,22 +86,22 @@ class CartonModel extends BaseModel { notifyListeners(); } - get selectedIndex => _selectedIndex; - get selectedIndexFilter => _selectedIndexFilter; + int get selectedIndex => _selectedIndex; + int get selectedIndexFilter => _selectedIndexFilter; initData() async { _selectedIndex = 1; _selectedIndexFilter = 1; _loadBoxes(); - if (_delivered != null) _delivered.close(); + if (_delivered != null) _delivered!.close(); _delivered = _getDelivered(); - _delivered.load(); + _delivered!.load(); } @override void privilegeChanged() { - if (user != null || !user.hasCarton()) { + if (user != null || !user!.hasCarton()) { _initData(); } } @@ -120,12 +119,12 @@ class CartonModel extends BaseModel { } Future _loadBoxes() async { - if (user == null || !user.hasCarton()) return; + if (user == null || !user!.hasCarton()) return; String path = "/$cartons_collection/"; - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); _boxes = []; try { - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("$path") .where("status", whereIn: [carton_packed_status, carton_shipped_status]) @@ -134,9 +133,10 @@ class CartonModel extends BaseModel { .snapshots() .listen((QuerySnapshot snapshot) { _boxes.clear(); - _boxes = snapshot.documents.map((documentSnapshot) { + _boxes = snapshot.docs.map((documentSnapshot) { var s = Carton.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data() as Map, + documentSnapshot.id); return s; }).toList(); notifyListeners(); @@ -147,18 +147,18 @@ class CartonModel extends BaseModel { } Future _loadCartonsByFilter(String orderName) async { - if (user == null || !user.hasCarton()) return null; + if (user == null || !user!.hasCarton()) return null; String path = "/$cartons_collection"; try { - Query listenerQuery = Firestore.instance + Query listenerQuery = FirebaseFirestore.instance .collection("$path") .where("carton_type", whereIn: [ carton_from_packages, carton_from_cartons ]).where("status", isEqualTo: carton_packed_status); - Query pageQuery = Firestore.instance + Query pageQuery = FirebaseFirestore.instance .collection("$path") .where("carton_type", whereIn: [carton_from_packages, carton_from_cartons]) @@ -172,10 +172,10 @@ class CartonModel extends BaseModel { } } - Paginator _getDelivered() { - if (user == null || !user.hasCarton()) return null; + Paginator? _getDelivered() { + if (user == null || !user!.hasCarton()) return null; - var pageQuery = Firestore.instance + var pageQuery = FirebaseFirestore.instance .collection("/$cartons_collection") .where("is_delivered", isEqualTo: true) .where("is_deleted", isEqualTo: false); @@ -186,10 +186,10 @@ class CartonModel extends BaseModel { } Future loadMore() async { - if (_delivered.ended || selectedIndex == 1) return; + if (_delivered == null && _delivered!.ended || selectedIndex == 1) return; isLoading = true; notifyListeners(); - await _delivered.load(onFinished: () { + await _delivered!.load(onFinished: () { isLoading = false; notifyListeners(); }); @@ -197,7 +197,7 @@ class CartonModel extends BaseModel { Future refresh() async { if (selectedIndex == 1) return; - await _delivered.refresh(onFinished: () { + await _delivered?.refresh(onFinished: () { notifyListeners(); }); } @@ -208,69 +208,62 @@ class CartonModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); - if (cartonListener != null) await cartonListener.cancel(); - if (_delivered != null) _delivered.close(); + if (listener != null) await listener!.cancel(); + if (cartonListener != null) await cartonListener!.cancel(); + if (_delivered != null) _delivered!.close(); if (cartonsByFilter != null) cartonsByFilter.close(); _boxes = []; } Future> getCartons(String shipmentID) async { String path = "/$cartons_collection"; - var querySnap = await Firestore.instance + var querySnap = await FirebaseFirestore.instance .collection(path) .where("shipment_id", isEqualTo: shipmentID) - .getDocuments(); - return querySnap.documents - .map((e) => Carton.fromMap(e.data, e.documentID)) - .toList(); + .get(); + return querySnap.docs.map((e) => Carton.fromMap(e.data(), e.id)).toList(); } Future> getCartonsByFcsShipment(String fcsShipmentID) async { String path = "/$cartons_collection"; - var querySnap = await Firestore.instance + var querySnap = await FirebaseFirestore.instance .collection(path) .where("fcs_shipment_id", isEqualTo: fcsShipmentID) .where("is_deleted", isEqualTo: false) - .getDocuments(); - return querySnap.documents - .map((e) => Carton.fromMap(e.data, e.documentID)) - .toList(); + .get(); + return querySnap.docs.map((e) => Carton.fromMap(e.data(), e.id)).toList(); } Future> getCartonsForInvoice( String fcsShipmentID, String userID) async { String path = "/$cartons_collection"; - var querySnap = await Firestore.instance + var querySnap = await FirebaseFirestore.instance .collection(path) .where("fcs_shipment_id", isEqualTo: fcsShipmentID) .where("user_id", isEqualTo: userID) .where("is_deleted", isEqualTo: false) .where("is_invoiced", isEqualTo: false) - .getDocuments(); - List cartons = querySnap.documents - .map((e) => Carton.fromMap(e.data, e.documentID)) - .toList(); + .get(); + List cartons = + querySnap.docs.map((e) => Carton.fromMap(e.data(), e.id)).toList(); return cartons; } Future> getMixCartonsByFcsShipment(String fcsShipmentID) async { String path = "/$cartons_collection"; - var querySnap = await Firestore.instance + var querySnap = await FirebaseFirestore.instance .collection(path) .where("fcs_shipment_id", isEqualTo: fcsShipmentID) .where("carton_type", isEqualTo: carton_mix_box) .where("is_deleted", isEqualTo: false) - .getDocuments(); - return querySnap.documents - .map((e) => Carton.fromMap(e.data, e.documentID)) - .toList(); + .get(); + return querySnap.docs.map((e) => Carton.fromMap(e.data(), e.id)).toList(); } Future getCarton(String id) async { String path = "/$cartons_collection"; - var snap = await Firestore.instance.collection(path).document(id).get(); - return Carton.fromMap(snap.data, snap.documentID); + var snap = await FirebaseFirestore.instance.collection(path).doc(id).get(); + return Carton.fromMap(snap.data() as Map, snap.id); } Future createCarton(Carton carton) { diff --git a/lib/pages/carton/package_carton_editor.dart b/lib/pages/carton/package_carton_editor.dart index 87f48e4..2d52b7d 100644 --- a/lib/pages/carton/package_carton_editor.dart +++ b/lib/pages/carton/package_carton_editor.dart @@ -8,12 +8,9 @@ import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/carton_size/carton_size_list.dart'; import 'package:fcs/pages/carton_size/model/carton_size_model.dart'; -import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/main/util.dart'; -import 'package:fcs/pages/rates/model/shipment_rate_model.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; import 'package:fcs/pages/widgets/delivery_address_selection.dart'; -import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/length_picker.dart'; import 'package:fcs/pages/widgets/local_button.dart'; import 'package:fcs/pages/widgets/local_text.dart'; @@ -21,7 +18,7 @@ import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; import 'cargo_type_addtion.dart'; @@ -29,9 +26,9 @@ import 'carton_cargo_table.dart'; import 'model/carton_model.dart'; class PackageCartonEditor extends StatefulWidget { - final Carton carton; - final bool isNew; - final User consignee; + final Carton? carton; + final bool? isNew; + final User? consignee; PackageCartonEditor({this.carton, this.isNew, this.consignee}); @override @@ -43,13 +40,13 @@ class _PackageCartonEditorState extends State { TextEditingController _widthCtl = new TextEditingController(); TextEditingController _heightCtl = new TextEditingController(); - Carton _carton; + Carton? _carton; bool _isLoading = false; - DeliveryAddress _deliveryAddress = new DeliveryAddress(); + DeliveryAddress? _deliveryAddress = new DeliveryAddress(); List _cargoTypes = []; - CartonSize selectedCatonSize; - bool isFromPackages; - bool isFromCartons; + CartonSize? selectedCatonSize; + bool isFromPackages = false; + bool isFromCartons = false; @override void initState() { @@ -59,19 +56,19 @@ class _PackageCartonEditorState extends State { _load() { _carton = widget.carton; - isFromPackages = _carton.cartonType == carton_from_packages; - isFromCartons = _carton.cartonType == carton_from_cartons; + isFromPackages = _carton!.cartonType == carton_from_packages; + isFromCartons = _carton!.cartonType == carton_from_cartons; - if (widget.isNew) { + if (widget.isNew!) { _lengthCtl.text = "0"; _widthCtl.text = "0"; _heightCtl.text = "0"; } else { - _cargoTypes = widget.carton.cargoTypes.map((e) => e.clone()).toList(); - _lengthCtl.text = _carton.length.toString(); - _widthCtl.text = _carton.width.toString(); - _heightCtl.text = _carton.height.toString(); - _deliveryAddress = _carton.deliveryAddress; + _cargoTypes = widget.carton!.cargoTypes.map((e) => e.clone()).toList(); + _lengthCtl.text = _carton!.length.toString(); + _widthCtl.text = _carton!.width.toString(); + _heightCtl.text = _carton!.height.toString(); + _deliveryAddress = _carton!.deliveryAddress; _getCartonSize(); } } @@ -79,9 +76,9 @@ class _PackageCartonEditorState extends State { _getCartonSize() { var cartonSizeModel = Provider.of(context, listen: false); cartonSizeModel.cartonSizes.forEach((c) { - if (c.length == _carton.length && - c.width == _carton.width && - c.height == _carton.height) { + if (c.length == _carton!.length && + c.width == _carton!.width && + c.height == _carton!.height) { selectedCatonSize = CartonSize( id: c.id, name: c.name, @@ -122,7 +119,7 @@ class _PackageCartonEditorState extends State { ], ); final createBtn = LocalButton( - textKey: widget.isNew ? "box.new_carton_btn" : "box.cargo.save.btn", + textKey: widget.isNew! ? "box.new_carton_btn" : "box.cargo.save.btn", callBack: _creatCarton, ); @@ -134,11 +131,10 @@ class _PackageCartonEditorState extends State { color: primaryColor, ), onPressed: () async { - List cargos = await Navigator.push>( + List? cargos = await Navigator.push>( context, CupertinoPageRoute(builder: (context) => CargoTypeAddition())); if (cargos == null) return; - if (cargos == null) return; setState(() { _cargoTypes.addAll( cargos.where((e) => !_cargoTypes.contains(e)).toList()); @@ -168,7 +164,7 @@ class _PackageCartonEditorState extends State { backgroundColor: Colors.white, title: LocalText( context, - widget.isNew ? "boxes.create.title" : "box.edit.title", + widget.isNew! ? "boxes.create.title" : "box.edit.title", fontSize: 20, color: primaryColor, ), @@ -187,13 +183,14 @@ class _PackageCartonEditorState extends State { deliveryAddress: _deliveryAddress, labelKey: "box.delivery_address", onTap: () async { - DeliveryAddress d = await Navigator.push( + DeliveryAddress? d = await Navigator.push( context, CupertinoPageRoute( builder: (context) => DeliveryAddressSelection( deliveryAddress: _deliveryAddress, user: User( - id: _carton.userID, name: _carton.userName), + id: _carton!.userID, + name: _carton!.userName), )), ); if (d == null) return; @@ -245,17 +242,17 @@ class _PackageCartonEditorState extends State { height: 1, color: Colors.grey, ), - onChanged: (CartonSize newValue) { + onChanged: (CartonSize? newValue) { setState(() { - if (newValue.name == MANAGE_CARTONSIZE) { + if (newValue!.name == MANAGE_CARTONSIZE) { selectedCatonSize = null; _manageCartonSize(); return; } selectedCatonSize = newValue; - _widthCtl.text = selectedCatonSize.width.toString(); - _heightCtl.text = selectedCatonSize.height.toString(); - _lengthCtl.text = selectedCatonSize.length.toString(); + _widthCtl.text = selectedCatonSize!.width.toString(); + _heightCtl.text = selectedCatonSize!.height.toString(); + _lengthCtl.text = selectedCatonSize!.length.toString(); }); }, isExpanded: true, @@ -295,8 +292,7 @@ class _PackageCartonEditorState extends State { _updateCargo(CargoType cargo) { setState(() { - var _c = - _cargoTypes.firstWhere((e) => e.id == cargo.id, orElse: () => null); + var _c = _cargoTypes.firstWhere((e) => e.id == cargo.id); if (_c != null) { _c.weight = cargo.weight; _c.qty = cargo.qty; @@ -305,13 +301,13 @@ class _PackageCartonEditorState extends State { } _creatCarton() async { - if ((_cargoTypes?.length ?? 0) == 0) { + if (_cargoTypes.length == 0) { showMsgDialog(context, "Error", "Expect at least one cargo type"); return; } - double l = double.parse(_lengthCtl.text, (s) => 0); - double w = double.parse(_widthCtl.text, (s) => 0); - double h = double.parse(_heightCtl.text, (s) => 0); + double l = double.parse(_lengthCtl.text); + double w = double.parse(_widthCtl.text); + double h = double.parse(_heightCtl.text); if ((l <= 0 || w <= 0 || h <= 0)) { showMsgDialog(context, "Error", "Invalid dimension"); return; @@ -322,22 +318,22 @@ class _PackageCartonEditorState extends State { } Carton carton = Carton(); - carton.id = _carton.id; - carton.cartonType = _carton.cartonType; - carton.fcsShipmentID = _carton.fcsShipmentID; + carton.id = _carton!.id; + carton.cartonType = _carton!.cartonType; + carton.fcsShipmentID = _carton!.fcsShipmentID; carton.cargoTypes = _cargoTypes; if (isFromPackages) { - carton.userID = _carton.userID; - carton.packages = _carton.packages.where((e) => e.isChecked).toList(); + carton.userID = _carton!.userID; + carton.packages = _carton!.packages.where((e) => e.isChecked).toList(); } if (isFromCartons) { - carton.userID = _carton.userID; - carton.fcsID = _carton.fcsID; - carton.userName = _carton.userName; - carton.senderID = _carton.senderID; - carton.senderFCSID = _carton.senderFCSID; - carton.senderName = _carton.senderName; + carton.userID = _carton!.userID; + carton.fcsID = _carton!.fcsID; + carton.userName = _carton!.userName; + carton.senderID = _carton!.senderID; + carton.senderFCSID = _carton!.senderFCSID; + carton.senderName = _carton!.senderName; } carton.length = l; @@ -350,12 +346,12 @@ class _PackageCartonEditorState extends State { try { CartonModel cartonModel = Provider.of(context, listen: false); - if (widget.isNew) { + if (widget.isNew!) { Carton _c = await cartonModel.createCarton(carton); Navigator.pop(context, _c); } else { await cartonModel.updateCarton(carton); - Carton _c = await cartonModel.getCarton(_carton.id); + Carton _c = await cartonModel.getCarton(_carton!.id!); Navigator.pop(context, _c); } } catch (e) { diff --git a/lib/pages/carton/total_weight_edit.dart b/lib/pages/carton/total_weight_edit.dart index 614e0d5..21632f3 100644 --- a/lib/pages/carton/total_weight_edit.dart +++ b/lib/pages/carton/total_weight_edit.dart @@ -10,9 +10,9 @@ import 'package:fcs/pages/main/util.dart'; typedef void ProfileCallback(); class TotalWeightEdit extends StatefulWidget { - final double totalWeight; + final double? totalWeight; - const TotalWeightEdit({Key key, this.totalWeight}) : super(key: key); + const TotalWeightEdit({Key? key, this.totalWeight}) : super(key: key); @override _TotalWeightEditState createState() => _TotalWeightEditState(); } @@ -24,7 +24,7 @@ class _TotalWeightEditState extends State { @override void initState() { super.initState(); - totalController.text = widget.totalWeight.toStringAsFixed(2); + totalController.text = widget.totalWeight!.toStringAsFixed(2); } @override diff --git a/lib/pages/carton/widgets.dart b/lib/pages/carton/widgets.dart index 3e9a50c..c690008 100644 --- a/lib/pages/carton/widgets.dart +++ b/lib/pages/carton/widgets.dart @@ -10,14 +10,14 @@ Widget getCartonNumberStatus(BuildContext context, Carton carton) { LocalText( context, '', - text: carton.cartonNumber ?? "", + text: carton.cartonNumber , color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold, ), Padding( padding: const EdgeInsets.only(left: 8.0), - child: Chip(label: Text(carton.status ?? "")), + child: Chip(label: Text(carton.status??"")), ), ], ); diff --git a/lib/pages/carton_search/carton_list_row.dart b/lib/pages/carton_search/carton_list_row.dart index 427a32e..563084e 100644 --- a/lib/pages/carton_search/carton_list_row.dart +++ b/lib/pages/carton_search/carton_list_row.dart @@ -1,45 +1,32 @@ import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'carton_search.dart'; -class CartonListRow extends StatefulWidget { - final CallbackCartonSelect callbackCartonSelect; +class CartonListRow extends StatelessWidget { + final CallbackCartonSelect? callbackCartonSelect; final Carton carton; // const CartonListRow({this.carton, this.callbackCartonSelect}); - CartonListRow( - {Key key, this.carton, this.callbackCartonSelect}) + CartonListRow({Key? key, required this.carton, this.callbackCartonSelect}) : super(key: key); - @override - _CartonListRowState createState() => _CartonListRowState(); -} - -class _CartonListRowState extends State { final double dotSize = 15.0; - Carton _carton; - @override - void initState() { - super.initState(); - this._carton = widget.carton; - } @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( border: Border( - bottom: BorderSide(color: Colors.grey[300]), + bottom: BorderSide(color: Colors.grey.shade300), ), ), child: InkWell( onTap: () { Navigator.pop(context); - if (widget.callbackCartonSelect != null) - widget.callbackCartonSelect(widget.carton); + if (callbackCartonSelect != null) callbackCartonSelect!(carton); }, child: Row( children: [ @@ -64,7 +51,7 @@ class _CartonListRowState extends State { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - _carton.cartonNumber ?? "", + carton.cartonNumber ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -72,7 +59,7 @@ class _CartonListRowState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, top: 10), child: new Text( - _carton.userName ?? "", + carton.userName ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), @@ -86,7 +73,7 @@ class _CartonListRowState extends State { child: Row( children: [ new Text( - "${_carton.cartonWeight?.toStringAsFixed(2) ?? ''} lb", + "${carton.cartonWeight?.toStringAsFixed(2)} lb", style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/carton_search/carton_search.dart b/lib/pages/carton_search/carton_search.dart index 87cc1c9..07c2215 100644 --- a/lib/pages/carton_search/carton_search.dart +++ b/lib/pages/carton_search/carton_search.dart @@ -10,7 +10,7 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/popupmenu.dart'; import 'package:fcs/pagination/paginator_listview.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; @@ -18,15 +18,15 @@ import 'carton_list_row.dart'; typedef CallbackCartonSelect(Carton carton); -Future searchCarton(BuildContext context, - {CallbackCartonSelect callbackCartonSelect}) async => +Future searchCarton(BuildContext context, + {CallbackCartonSelect? callbackCartonSelect}) async => await showSearch( context: context, delegate: PartSearchDelegate(callbackCartonSelect: callbackCartonSelect), ); class PartSearchDelegate extends SearchDelegate { - final CallbackCartonSelect callbackCartonSelect; + final CallbackCartonSelect? callbackCartonSelect; PartSearchDelegate({this.callbackCartonSelect}); @override @@ -38,10 +38,10 @@ class PartSearchDelegate extends SearchDelegate { return theme.copyWith( inputDecorationTheme: InputDecorationTheme( hintStyle: TextStyle( - color: theme.primaryTextTheme.caption.color, fontSize: 14)), + color: theme.primaryTextTheme.caption!.color, fontSize: 14)), textTheme: theme.textTheme.copyWith( - title: theme.textTheme.title.copyWith( - color: theme.primaryTextTheme.title.color, fontSize: 16)), + title: theme.textTheme.title!.copyWith( + color: theme.primaryTextTheme.title!.color, fontSize: 16)), primaryColor: primaryColor, ); } @@ -85,7 +85,7 @@ class PartSearchDelegate extends SearchDelegate { Widget buildLeading(BuildContext context) { return IconButton( icon: Icon(Icons.arrow_back), - onPressed: () => close(context, null), + onPressed: () => close(context, new Carton()), ); } @@ -96,7 +96,7 @@ class PartSearchDelegate extends SearchDelegate { future: cartonModel.searchCarton(query), builder: (context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { - if (snapshot.data.length == 0) { + if (snapshot.data!.length == 0) { return Container( child: Center( child: Text( @@ -109,7 +109,7 @@ class PartSearchDelegate extends SearchDelegate { return Container( padding: EdgeInsets.only(top: 15), child: ListView( - children: snapshot.data + children: snapshot.data! .map((u) => CartonListRow( key: ValueKey(u.id), carton: u, @@ -158,20 +158,20 @@ class PartSearchDelegate extends SearchDelegate { } _scan(BuildContext context) async { - PermissionStatus permission = - await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); - if (permission != PermissionStatus.granted) { - Map permissions = - await PermissionHandler() - .requestPermissions([PermissionGroup.camera]); - if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { - showMsgDialog(context, "Error", "Camera permission is not granted"); - return null; - } - } + // PermissionStatus permission = + // await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); + // if (permission != PermissionStatus.granted) { + // Map permissions = + // await PermissionHandler() + // .requestPermissions([PermissionGroup.camera]); + // if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { + // showMsgDialog(context, "Error", "Camera permission is not granted"); + // return null; + // } + // } try { - String barcode = await scanBarcode(); + String? barcode = await scanBarcode(); if (barcode != null) { query = barcode; showResults(context); diff --git a/lib/pages/carton_size/carton_size_editor.dart b/lib/pages/carton_size/carton_size_editor.dart index 0b3662b..b9a21c1 100644 --- a/lib/pages/carton_size/carton_size_editor.dart +++ b/lib/pages/carton_size/carton_size_editor.dart @@ -7,13 +7,13 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; import 'model/carton_size_model.dart'; class CartonSizeEditor extends StatefulWidget { - final CartonSize cartonSize; + final CartonSize? cartonSize; CartonSizeEditor({this.cartonSize}); @override @@ -27,8 +27,8 @@ class _CartonSizeEditorState extends State { TextEditingController _lengthController = new TextEditingController(); bool _isLoading = false; - CartonSize _cartonSize; - bool _isNew; + CartonSize? _cartonSize; + bool _isNew = false; @override void initState() { @@ -36,10 +36,10 @@ class _CartonSizeEditorState extends State { if (widget.cartonSize != null) { _cartonSize = widget.cartonSize; _isNew = false; - _nameController.text = _cartonSize.name; - _widthController.text = _cartonSize.width.toString(); - _heightController.text = _cartonSize.height.toString(); - _lengthController.text = _cartonSize.length.toString(); + _nameController.text = _cartonSize!.name ?? ""; + _widthController.text = _cartonSize!.width.toString(); + _heightController.text = _cartonSize!.height.toString(); + _lengthController.text = _cartonSize!.length.toString(); } else { _lengthController.text = "12"; _widthController.text = "12"; @@ -110,7 +110,7 @@ class _CartonSizeEditorState extends State { await cartonSizeModel.addCartonSize(_cartonSize); } else { CartonSize _cartonSize = CartonSize( - id: widget.cartonSize.id, + id: widget.cartonSize!.id, name: _nameController.text, length: l, width: w, @@ -184,7 +184,7 @@ class _CartonSizeEditorState extends State { CartonSize _cartonSize = CartonSize( name: _nameController.text, length: l, width: w, height: h); - return widget.cartonSize.isChangedForEdit(_cartonSize); + return widget.cartonSize!.isChangedForEdit(_cartonSize); } } } diff --git a/lib/pages/carton_size/carton_size_list.dart b/lib/pages/carton_size/carton_size_list.dart index 2341edb..e396f11 100644 --- a/lib/pages/carton_size/carton_size_list.dart +++ b/lib/pages/carton_size/carton_size_list.dart @@ -40,7 +40,7 @@ class _CartonSizeListState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( - p.name, + p.name ?? "", style: TextStyle(fontSize: 15.0), ), Padding( @@ -135,7 +135,7 @@ class _CartonSizeListState extends State { CartonSizeModel cartonSizeModel = Provider.of(context, listen: false); try { - await cartonSizeModel.deleteCartonSize(cartonSize.id); + await cartonSizeModel.deleteCartonSize(cartonSize.id!); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { diff --git a/lib/pages/carton_size/model/carton_size_model.dart b/lib/pages/carton_size/model/carton_size_model.dart index d9e9c1b..c104453 100644 --- a/lib/pages/carton_size/model/carton_size_model.dart +++ b/lib/pages/carton_size/model/carton_size_model.dart @@ -13,7 +13,7 @@ class CartonSizeModel extends BaseModel { List cartonSizes = []; final log = Logger('CartonSizeModel'); - StreamSubscription listener; + StreamSubscription? listener; List get getCartonSizes { var _cartonSizes = new List.from(cartonSizes); @@ -27,17 +27,18 @@ class CartonSizeModel extends BaseModel { Future _loadCartonSizes() async { try { - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection( "/$config_collection/$setting_doc_id/$carton_sizes_collection") .snapshots() .listen((QuerySnapshot snapshot) { cartonSizes.clear(); - cartonSizes = snapshot.documents.map((documentSnapshot) { + cartonSizes = snapshot.docs.map((documentSnapshot) { var c = CartonSize.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data() as Map, + documentSnapshot.id); return c; }).toList(); notifyListeners(); @@ -49,7 +50,7 @@ class CartonSizeModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); cartonSizes = []; } diff --git a/lib/pages/chat/bubble.dart b/lib/pages/chat/bubble.dart index 9a99de3..dabed50 100644 --- a/lib/pages/chat/bubble.dart +++ b/lib/pages/chat/bubble.dart @@ -2,7 +2,6 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/package/package_info.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/fcs_id_icon.dart'; -import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -14,18 +13,18 @@ typedef CallbackOnViewDetail(); class Bubble extends StatelessWidget { Bubble( {this.message, - this.date, - this.delivered, - this.isMine, + required this.date, + required this.delivered, + required this.isMine, this.sender, - this.isSystem, - this.isCustomer, - this.showDate, + required this.isSystem, + required this.isCustomer, + required this.showDate, this.callbackOnViewDetail}); - final CallbackOnViewDetail callbackOnViewDetail; + final CallbackOnViewDetail? callbackOnViewDetail; final DateTime date; - final String message, sender; + final String? message, sender; final bool delivered, isMine, isSystem, isCustomer, showDate; @override @@ -84,7 +83,7 @@ class Bubble extends StatelessWidget { fontWeight: FontWeight.bold))) ] : [ - Text(isCustomer ? "FCS Team" : sender, + Text(isCustomer ? "FCS Team" : sender ?? "", style: TextStyle( color: Colors.black38, fontSize: 10.0, @@ -102,8 +101,8 @@ class Bubble extends StatelessWidget { children: [ Padding( padding: EdgeInsets.only(right: 48.0), - child: Text(message, - style: hasUnicode(message) + child: Text(message ?? "", + style: hasUnicode(message ?? "") ? newLabelStyleMM(color: primaryColor) : newLabelStyle(color: primaryColor))), Positioned( @@ -130,6 +129,6 @@ class Bubble extends StatelessWidget { } _viewDetail() { - if (callbackOnViewDetail != null) callbackOnViewDetail(); + if (callbackOnViewDetail != null) callbackOnViewDetail!(); } } diff --git a/lib/pages/chat/message_detail.dart b/lib/pages/chat/message_detail.dart index c1209e7..d1b7144 100644 --- a/lib/pages/chat/message_detail.dart +++ b/lib/pages/chat/message_detail.dart @@ -21,14 +21,17 @@ import 'package:provider/provider.dart'; import 'bubble.dart'; class MessageDetail extends StatelessWidget { - final String receiverName; - final String receiverID; + final String? receiverName; + final String? receiverID; final MessageModel messageModel; final TextEditingController textEditingController = TextEditingController(); final ScrollController listScrollController = ScrollController(); MessageDetail( - {Key key, this.messageModel, this.receiverName, this.receiverID}) + {Key? key, + required this.messageModel, + this.receiverName, + this.receiverID}) : super(key: key) { listScrollController.addListener(() { if (listScrollController.offset >= @@ -44,7 +47,7 @@ class MessageDetail extends StatelessWidget { @override Widget build(BuildContext context) { - String userID = Provider.of(context).user.id; + String userID = Provider.of(context).user?.id ?? ""; return Scaffold( appBar: AppBar( @@ -96,8 +99,8 @@ class MessageDetail extends StatelessWidget { Widget buildBubble(Message msg, String userID, bool showDate, CallbackOnViewDetail callback) { return Bubble( - message: msg.message, - date: msg.date, + message: msg.message ?? "", + date: msg.date!, delivered: true, sender: msg.senderName, isMine: msg.senderID == userID || msg.receiverID == receiverID, @@ -117,8 +120,8 @@ class MessageDetail extends StatelessWidget { child: Container( child: TextField( onSubmitted: (value) { - Provider.of(context, listen: false) - .sendMessage(textEditingController.text, receiverID); + Provider.of(context, listen: false).sendMessage( + textEditingController.text, receiverID ?? ""); textEditingController.text = ""; }, style: TextStyle(color: primaryColor, fontSize: 15.0), @@ -152,8 +155,8 @@ class MessageDetail extends StatelessWidget { child: IconButton( icon: Icon(Icons.send), onPressed: () { - Provider.of(context, listen: false) - .sendMessage(textEditingController.text, receiverID); + Provider.of(context, listen: false).sendMessage( + textEditingController.text, receiverID ?? ""); textEditingController.text = ""; }, color: primaryColor, @@ -165,7 +168,8 @@ class MessageDetail extends StatelessWidget { ), width: double.infinity, decoration: BoxDecoration( - border: Border(top: BorderSide(color: Colors.grey[700], width: 0.5)), + border: + Border(top: BorderSide(color: Colors.grey.shade700, width: 0.5)), color: Colors.white), ); } @@ -176,7 +180,7 @@ class MessageDetail extends StatelessWidget { message.messageID != "") { PackageModel packageModel = Provider.of(context, listen: false); - Package p = await packageModel.getPackage(message.messageID); + Package p = await packageModel.getPackage(message.messageID!); if (p == null) return; Navigator.push(context, CupertinoPageRoute(builder: (context) => PackageInfo(package: p))); @@ -186,7 +190,7 @@ class MessageDetail extends StatelessWidget { message.messageID != "") { MainModel mainModel = Provider.of(context, listen: false); - if (mainModel.user.isCustomer()) { + if (mainModel.user?.isCustomer() ?? false) { Navigator.push( context, CupertinoPageRoute(builder: (context) => Profile())); } else { @@ -202,7 +206,7 @@ class MessageDetail extends StatelessWidget { message.messageID != "") { ShipmentModel shipmentModel = Provider.of(context, listen: false); - Shipment s = await shipmentModel.getShipment(message.messageID); + Shipment s = await shipmentModel.getShipment(message.messageID!); if (s == null) return; await Navigator.push( context, diff --git a/lib/pages/chat/model/message_model.dart b/lib/pages/chat/model/message_model.dart index 447a325..64535ef 100644 --- a/lib/pages/chat/model/message_model.dart +++ b/lib/pages/chat/model/message_model.dart @@ -10,44 +10,46 @@ import 'package:logging/logging.dart'; class MessageModel extends BaseModel { final log = Logger('MessageModel'); - List messages; + List messages = []; @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); messages = []; } - Query query; - DocumentSnapshot prevSnap; - bool isEnded; - bool isLoading; - String userID; - StreamSubscription listener; + late Query query; + DocumentSnapshot? prevSnap; + late bool isEnded; + late bool isLoading; + String? userID; + StreamSubscription? listener; static const int rowPerLoad = 20; - void initQuery(String userID) { + void initQuery(String? userID) { + if (userID == null) return; this.messages = []; this.userID = userID; this.prevSnap = null; - query = Firestore.instance + query = FirebaseFirestore.instance .collection("$user_collection/$userID/$messages_collection") .orderBy('date', descending: true); load(); } Future load() async { + if (prevSnap == null) return; Query _query = - prevSnap != null ? query.startAfterDocument(prevSnap) : query; + prevSnap != null ? query.startAfterDocument(prevSnap!) : query; QuerySnapshot snapshot = - await _query.limit(rowPerLoad).getDocuments(source: Source.server); + await _query.limit(rowPerLoad).get(GetOptions(source: Source.server)); - int count = snapshot.documents.length; + int count = snapshot.docs.length; isEnded = count < rowPerLoad; - prevSnap = count > 0 ? snapshot.documents[count - 1] : prevSnap; + prevSnap = count > 0 ? snapshot.docs[count - 1] : prevSnap; - snapshot.documents.forEach((e) { - messages.add(Message.fromMap(e.data, e.documentID)); + snapshot.docs.forEach((e) { + messages.add(Message.fromMap(e.data() as Map, e.id)); if (messages.length == 1) { _initListener(e); } @@ -56,20 +58,22 @@ class MessageModel extends BaseModel { } void _initListener(DocumentSnapshot snap) { - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("$user_collection/$userID/$messages_collection") .endBeforeDocument(snap) .orderBy('date', descending: true) .snapshots(includeMetadataChanges: true) .listen((qs) { - qs.documentChanges.forEach((c) { + qs.docChanges.forEach((c) { switch (c.type) { case DocumentChangeType.added: log.info("added!! $c"); messages.insert( - 0, Message.fromMap(c.document.data, c.document.documentID)); + 0, + Message.fromMap( + c.doc.data() as Map, c.doc.id)); notifyListeners(); break; case DocumentChangeType.modified: diff --git a/lib/pages/contact/contact_editor.dart b/lib/pages/contact/contact_editor.dart index 5a7cf50..8092c2f 100644 --- a/lib/pages/contact/contact_editor.dart +++ b/lib/pages/contact/contact_editor.dart @@ -1,6 +1,5 @@ import 'package:fcs/domain/vo/contact.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/contact/model/contact_model.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/input_text.dart'; @@ -14,7 +13,7 @@ import 'package:provider/provider.dart'; import 'widgets.dart'; class ContactEditor extends StatefulWidget { - final Contact contact; + final Contact? contact; const ContactEditor({this.contact}); @override _ContactEditorState createState() => _ContactEditorState(); @@ -29,22 +28,23 @@ class _ContactEditorState extends State { TextEditingController _facebook = new TextEditingController(); bool _isLoading = false; - bool isNew; + bool isNew = false; + Contact? _contact; @override void initState() { + if (widget.contact != null) _contact = widget.contact!; super.initState(); - if (widget.contact != null) { - isNew = false; - _usaPhone.text = widget.contact.usaContactNumber; - _mmPhone.text = widget.contact.mmContactNumber; - _usaAddress.text = widget.contact.usaAddress; - _mmAddress.text = widget.contact.mmAddress; - _email.text = widget.contact.emailAddress; - _facebook.text = widget.contact.facebookLink; - } else { - isNew = true; - } + isNew = widget.contact == null; + } + + initContact() { + _usaPhone.text = _contact?.usaContactNumber ?? ''; + _mmPhone.text = _contact?.mmContactNumber ?? ''; + _usaAddress.text = _contact?.usaAddress ?? ''; + _mmAddress.text = _contact?.mmAddress ?? ''; + _email.text = _contact?.emailAddress ?? ''; + _facebook.text = _contact?.facebookLink ?? ''; } @override @@ -136,14 +136,17 @@ class _ContactEditorState extends State { _isLoading = true; }); try { - widget.contact.usaContactNumber = _usaPhone.text; - widget.contact.mmContactNumber = _mmPhone.text; - widget.contact.usaAddress = _usaAddress.text; - widget.contact.mmAddress = _mmAddress.text; - widget.contact.emailAddress = _email.text; - widget.contact.facebookLink = _facebook.text; - var contactModel = Provider.of(context, listen: false); - await contactModel.saveContact(widget.contact); + _contact?.usaContactNumber = _usaPhone.text; + _contact?.mmContactNumber = _mmPhone.text; + _contact?.usaAddress = _usaAddress.text; + _contact?.mmAddress = _mmAddress.text; + _contact?.emailAddress = _email.text; + _contact?.facebookLink = _facebook.text; + if (this._contact != null) { + var contactModel = Provider.of(context, listen: false); + await contactModel.saveContact(_contact!); + } + Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/contact/contact_page.dart b/lib/pages/contact/contact_page.dart index 404b2ac..f0c1fae 100644 --- a/lib/pages/contact/contact_page.dart +++ b/lib/pages/contact/contact_page.dart @@ -1,7 +1,6 @@ import 'package:fcs/domain/entities/setting.dart'; import 'package:fcs/domain/vo/contact.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/contact/contact_editor.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/widgets/local_text.dart'; @@ -22,7 +21,8 @@ class ContactPage extends StatefulWidget { class _ContactPageState extends State { @override Widget build(BuildContext context) { - Setting setting = Provider.of(context).setting; + Setting? setting = Provider.of(context).setting; + if (setting == null) return Container(); bool isEditable = context.select((MainModel m) => m.contactEditable()); return Scaffold( @@ -62,14 +62,14 @@ class _ContactPageState extends State { children: [ itemTitle(context, "contact.callus"), contactItem(context, setting.usaContactNumber, CupertinoIcons.phone, - onTap: () => _call(setting.usaContactNumber), + onTap: () => _call(setting.usaContactNumber ?? ""), labelKey: "contact.usa.phone"), contactItem( context, setting.mmContactNumber, CupertinoIcons.phone, onTap: () => _call( - setting.mmContactNumber, + setting.mmContactNumber ?? "", ), labelKey: "contact.mm.phone", ), @@ -91,7 +91,7 @@ class _ContactPageState extends State { context, setting.emailAddress, CupertinoIcons.mail, - onTap: () => _email(setting.emailAddress), + onTap: () => _email(setting.emailAddress ?? ""), labelKey: "contact.fcs.email", ), itemTitle(context, "contact.visitus"), @@ -99,7 +99,7 @@ class _ContactPageState extends State { context, setting.facebookLink, FontAwesomeIcons.facebook, - onTap: () => _opencontactItem(setting.facebookLink), + onTap: () => _opencontactItem(setting.facebookLink ?? ""), labelKey: "contact.facebook", ), ], diff --git a/lib/pages/contact/widgets.dart b/lib/pages/contact/widgets.dart index 40a78f6..f8f38b8 100644 --- a/lib/pages/contact/widgets.dart +++ b/lib/pages/contact/widgets.dart @@ -7,25 +7,25 @@ Widget itemTitle(BuildContext context, String textKey) { return Padding( padding: const EdgeInsets.only(left: 18.0, top: 25, bottom: 5), child: Text( - AppTranslations.of(context).text(textKey), + AppTranslations.of(context)!.text(textKey), style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), ), ); } -Widget subItemTitle(BuildContext context, String textKey, {IconData iconData}) { +Widget subItemTitle(BuildContext context, String textKey, {IconData? iconData}) { return Padding( padding: const EdgeInsets.only(left: 0, top: 0, bottom: 0), child: Row( children: [ Icon( - iconData, + iconData, color: primaryColor, ), SizedBox(width: 10), Text( - AppTranslations.of(context).text(textKey), + AppTranslations.of(context)!.text(textKey), style: TextStyle( fontWeight: FontWeight.w700, fontSize: 15, color: primaryColor), ), @@ -34,8 +34,8 @@ Widget subItemTitle(BuildContext context, String textKey, {IconData iconData}) { ); } -Widget contactItem(BuildContext context, String text, IconData iconData, - {Function() onTap, String labelKey}) { +Widget contactItem(BuildContext context, String? text, IconData iconData, + {Function()? onTap, String? labelKey}) { return Material( child: Padding( padding: const EdgeInsets.only(left: 18.0, bottom: 10, right: 18), diff --git a/lib/pages/customer/customer_editor.dart b/lib/pages/customer/customer_editor.dart index e3df283..c85a44f 100644 --- a/lib/pages/customer/customer_editor.dart +++ b/lib/pages/customer/customer_editor.dart @@ -14,7 +14,7 @@ import 'package:provider/provider.dart'; typedef void FindCallBack(); class CustomerEditor extends StatefulWidget { - final User customer; + final User? customer; const CustomerEditor({this.customer}); @override _CustomerEditorState createState() => _CustomerEditorState(); @@ -34,17 +34,17 @@ class _CustomerEditorState extends State { children: [ Expanded( child: DisplayText( - text: widget.customer.phoneNumber, + text: widget.customer!.phoneNumber, labelTextKey: "customer.phone", iconData: Icons.phone, )), IconButton( icon: Icon(Icons.open_in_new, color: primaryColor), - onPressed: () => call(context, widget.customer.phoneNumber)), + onPressed: () => call(context, widget.customer?.phoneNumber ?? "")), ], ); - final enabled = widget.customer.status != user_disabled_status; + final enabled = widget.customer!.status != user_disabled_status; final enableBox = LocalButton( textKey: enabled ? "customer.disable.btn" : "customer.enable.btn", iconData: enabled ? Icons.lock : Icons.lock_open, @@ -68,7 +68,7 @@ class _CustomerEditorState extends State { onPressed: () => Navigator.of(context).pop(), ), title: Text( - widget.customer.name, + widget.customer?.name ?? "", style: TextStyle( fontSize: 20, color: primaryColor, @@ -81,26 +81,26 @@ class _CustomerEditorState extends State { children: [ phoneNumberBox, DisplayText( - text: widget.customer.fcsID, + text: widget.customer!.fcsID, labelTextKey: "customer.fcs.id", icon: FcsIDIcon(), ), DisplayText( - text: widget.customer.status, + text: widget.customer!.status, labelTextKey: "customer.status", iconData: Icons.add_alarm, ), SizedBox( height: 20, ), - widget.customer.requested + widget.customer!.requested ? fcsButton( context, getLocalString( context, "customer.invitation.request.confirm"), callack: _add) : Container(), - widget.customer.joined || widget.customer.disabled + widget.customer!.joined || widget.customer!.disabled ? enableBox : Container() ], @@ -119,7 +119,7 @@ class _CustomerEditorState extends State { CustomerModel customerModel = Provider.of(context, listen: false); try { - await customerModel.acceptRequest(widget.customer.id); + await customerModel.acceptRequest(widget.customer?.id ?? ""); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -139,7 +139,7 @@ class _CustomerEditorState extends State { CustomerModel customerModel = Provider.of(context, listen: false); try { - await customerModel.enableUser(widget.customer, enabled); + await customerModel.enableUser(widget.customer!, enabled); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/customer/customer_list.dart b/lib/pages/customer/customer_list.dart index a1fbd72..09c4cba 100644 --- a/lib/pages/customer/customer_list.dart +++ b/lib/pages/customer/customer_list.dart @@ -125,7 +125,7 @@ class _CustomerListState extends State { Padding( padding: const EdgeInsets.only(top: 2.0), child: new Text( - customer.name, + customer.name ?? "", style: new TextStyle( fontSize: 20.0, color: primaryColor), ), @@ -171,7 +171,7 @@ class _CustomerListState extends State { children: [ Padding( padding: const EdgeInsets.only(right: 5), - child: _status(customer.status), + child: _status(customer.status ?? ""), ), Padding( padding: const EdgeInsets.only(right: 5), @@ -222,22 +222,22 @@ class _CustomerListState extends State { ))) .then((value) { if (customer.fcsUnseenCount > 0) { - messageModel.seenMessages(customer.id, false); + messageModel.seenMessages(customer.id ?? "", false); } }); if (customer.fcsUnseenCount > 0) { - messageModel.seenMessages(customer.id, false); + messageModel.seenMessages(customer.id ?? "", false); } } _share(User user) async { MainModel mainModel = Provider.of(context, listen: false); - String appUrl = mainModel.setting.appUrl; - final RenderBox box = context.findRenderObject(); + String appUrl = mainModel.setting?.appUrl ?? ""; + final RenderBox? box = context.findRenderObject() as RenderBox; await Share.share( "Join us on FCS Logistics App. Here is the link:\n $appUrl\n" + user.share, subject: "Invitation to FCS Logistics App", - sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); + sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size); } } diff --git a/lib/pages/customer/invitation_create.dart b/lib/pages/customer/invitation_create.dart index af2e2ed..e2bb37a 100644 --- a/lib/pages/customer/invitation_create.dart +++ b/lib/pages/customer/invitation_create.dart @@ -19,7 +19,7 @@ class _InvitationCreateState extends State { TextEditingController _phoneController = new TextEditingController(); bool _isLoading = false; - String dialCode; + late String dialCode; @override void initState() { @@ -85,7 +85,7 @@ class _InvitationCreateState extends State { ), Container( decoration: BoxDecoration( - border: Border.all(color: Colors.grey[400], width: 1), + border: Border.all(color: Colors.grey.shade400, width: 1), borderRadius: BorderRadius.all(Radius.circular(12.0))), child: CountryCodePicker( onChanged: _countryChange, @@ -140,7 +140,7 @@ class _InvitationCreateState extends State { _countryChange(CountryCode countryCode) { setState(() { - dialCode = countryCode.dialCode; + dialCode = countryCode.dialCode!; }); } diff --git a/lib/pages/customer/invitation_editor.dart b/lib/pages/customer/invitation_editor.dart index 837f704..fe2f946 100644 --- a/lib/pages/customer/invitation_editor.dart +++ b/lib/pages/customer/invitation_editor.dart @@ -11,7 +11,7 @@ import 'package:provider/provider.dart'; typedef void FindCallBack(); class InvitationEditor extends StatefulWidget { - final User customer; + final User? customer; const InvitationEditor({this.customer}); @override _InvitationEditorState createState() => _InvitationEditorState(); @@ -31,13 +31,13 @@ class _InvitationEditorState extends State { children: [ Expanded( child: DisplayText( - text: widget.customer.phoneNumber, + text: widget.customer!.phoneNumber, labelTextKey: getLocalString(context, "customer.phone"), iconData: Icons.phone, )), IconButton( icon: Icon(Icons.open_in_new, color: primaryColor), - onPressed: () => call(context, widget.customer.phoneNumber)), + onPressed: () => call(context, widget.customer?.phoneNumber ?? "")), ], ); @@ -57,7 +57,7 @@ class _InvitationEditorState extends State { onPressed: () => Navigator.of(context).pop(), ), title: Text( - widget.customer.name, + widget.customer?.name ?? "", style: TextStyle(fontSize: 20, color: primaryColor), ), ), @@ -87,7 +87,7 @@ class _InvitationEditorState extends State { CustomerModel customerModel = Provider.of(context, listen: false); try { - await customerModel.deleteInvite(widget.customer.phoneNumber); + await customerModel.deleteInvite(widget.customer?.phoneNumber ?? ""); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/customer/model/customer_model.dart b/lib/pages/customer/model/customer_model.dart index 1413f3a..a82c24b 100644 --- a/lib/pages/customer/model/customer_model.dart +++ b/lib/pages/customer/model/customer_model.dart @@ -12,8 +12,8 @@ class CustomerModel extends BaseModel { List customers = []; List invitations = []; - StreamSubscription customerListener; - StreamSubscription invitationListener; + late StreamSubscription? customerListener; + late StreamSubscription? invitationListener; @override void privilegeChanged() { @@ -24,8 +24,8 @@ class CustomerModel extends BaseModel { @override logout() async { - if (customerListener != null) customerListener.cancel(); - if (invitationListener != null) invitationListener.cancel(); + if (customerListener != null) customerListener!.cancel(); + if (invitationListener != null) invitationListener!.cancel(); customers = []; invitations = []; } @@ -43,21 +43,22 @@ class CustomerModel extends BaseModel { } Future _loadCustomer() async { - if (user == null || !user.hasCustomers()) return; + if (user == null && !user!.hasCustomers()) return; try { - if (customerListener != null) customerListener.cancel(); + if (customerListener != null) customerListener!.cancel(); - customerListener = Firestore.instance + customerListener = FirebaseFirestore.instance .collection("/$user_collection") .where("is_sys_admin", isEqualTo: false) .orderBy("message_time", descending: true) .snapshots() .listen((QuerySnapshot snapshot) { customers.clear(); - customers = snapshot.documents.map((documentSnapshot) { - var user = - User.fromMap(documentSnapshot.data, documentSnapshot.documentID); + customers = snapshot.docs.map((documentSnapshot) { + var user = User.fromMap( + documentSnapshot.data() as Map, + documentSnapshot.id); return user; }).toList(); notifyListeners(); @@ -68,19 +69,20 @@ class CustomerModel extends BaseModel { } Future _loadInvitations() async { - if (user == null || !user.hasCustomers()) return; + if (user == null && !user!.hasCustomers()) return; try { - if (invitationListener != null) invitationListener.cancel(); + if (invitationListener != null) invitationListener!.cancel(); - invitationListener = Firestore.instance + invitationListener = FirebaseFirestore.instance .collection("/$invitations_collection") .snapshots() .listen((QuerySnapshot snapshot) { invitations.clear(); - invitations = snapshot.documents.map((documentSnapshot) { - var user = - User.fromMap(documentSnapshot.data, documentSnapshot.documentID); + invitations = snapshot.docs.map((documentSnapshot) { + var user = User.fromMap( + documentSnapshot.data() as Map, + documentSnapshot.id); return user; }).toList(); notifyListeners(); @@ -90,23 +92,22 @@ class CustomerModel extends BaseModel { } } - Future getUser(String id) async { + Future getUser(String? id) async { String path = "/$user_collection"; - var snap = await Firestore.instance.collection(path).document(id).get(); - return User.fromMap(snap.data, snap.documentID); + var snap = await FirebaseFirestore.instance.collection(path).doc(id).get(); + return User.fromMap(snap.data() as Map, snap.id); } Future> getInvoiceUsers(String fcsShipmentID) async { List users = []; try { - var snaps = await Firestore.instance + var snaps = await FirebaseFirestore.instance .collection( "/$fcs_shipment_collection/$fcsShipmentID/$user_collection") .where("pending_invoice_carton_count", isGreaterThan: 0) - .getDocuments(source: Source.server); - users = snaps.documents.map((documentSnapshot) { - var user = - User.fromMap(documentSnapshot.data, documentSnapshot.documentID); + .get(GetOptions(source: Source.server)); + users = snaps.docs.map((documentSnapshot) { + var user = User.fromMap(documentSnapshot.data(), documentSnapshot.id); return user; }).toList(); } catch (e) { @@ -116,6 +117,6 @@ class CustomerModel extends BaseModel { } Future enableUser(User user, bool enabled) { - return Services.instance.userService.enableUser(user.id, enabled); + return Services.instance.userService.enableUser(user.id ?? "", enabled); } } diff --git a/lib/pages/delivery/delivery_info.dart b/lib/pages/delivery/delivery_info.dart index f9fecd2..fef0d5e 100644 --- a/lib/pages/delivery/delivery_info.dart +++ b/lib/pages/delivery/delivery_info.dart @@ -22,14 +22,14 @@ import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); class DeliveryInfo extends StatefulWidget { - final Carton box; + final Carton? box; DeliveryInfo({this.box}); @override @@ -38,8 +38,8 @@ class DeliveryInfo extends StatefulWidget { class _DeliveryInfoState extends State { bool _isLoading = false; - Carton _box; - String _selectedCartonType; + late Carton _box; + late String _selectedCartonType; List _packages = []; List _mixBoxes = []; Carton _selectedShipmentBox = new Carton(); @@ -51,17 +51,17 @@ class _DeliveryInfoState extends State { double volumetricRatio = 0; double shipmentWeight = 0; - bool isMixBox; - bool isFromShipments; - bool isFromPackages; - bool isSmallBag; - bool isEdiable; + late bool isMixBox; + late bool isFromShipments; + late bool isFromPackages; + late bool isSmallBag; + late bool isEdiable; @override void initState() { super.initState(); - _box = widget.box; - _selectedCartonType = _box.cartonType; + if (widget.box != null) _box = widget.box!; + _selectedCartonType = _box.cartonType ?? ''; //for shipment weight volumetricRatio = Provider.of(context, listen: false) @@ -80,7 +80,7 @@ class _DeliveryInfoState extends State { _heightController.text = _box.height.toString(); _lengthController.text = _box.length.toString(); _cargoTypes = _box.cargoTypes; - _deliveryAddress = _box.deliveryAddress; + _deliveryAddress = _box.deliveryAddress!; isMixBox = _box.cartonType == carton_mix_box; isFromShipments = _box.cartonType == carton_from_shipments; isFromPackages = _box.cartonType == carton_from_packages; @@ -96,7 +96,7 @@ class _DeliveryInfoState extends State { if (_box.cartonType == carton_from_packages && _box.userID == null) return; PackageModel packageModel = Provider.of(context, listen: false); - List packages = await packageModel.getPackages(_box.userID, [ + List packages = await packageModel.getPackages(_box.userID!, [ package_processed_status, package_packed_status, package_shipped_status, @@ -135,21 +135,22 @@ class _DeliveryInfoState extends State { final cartonTypeBox = LocalRadioButtons( readOnly: true, values: cartonModel.cartonTypesInfo, - selectedValue: - _box.isShipmentCarton ? carton_from_shipments : _box.cartonType); + selectedValue: (_box.isShipmentCarton ?? false) + ? carton_from_shipments + : _box.cartonType); final shipmentBox = DisplayText( text: _box.fcsShipmentNumber, labelTextKey: "box.fcs_shipment_num", iconData: Ionicons.ios_airplane, ); final fcsIDBox = DisplayText( - text: _box.fcsID == null ? "" : _box.fcsID, + text: _box.fcsID, labelTextKey: "box.fcs.id", icon: FcsIDIcon(), ); final customerNameBox = DisplayText( - text: _box.userName == null ? "" : _box.userName, + text: _box.userName, labelTextKey: "box.name", iconData: Icons.person, ); @@ -173,13 +174,11 @@ class _DeliveryInfoState extends State { children: [ Expanded( child: new Text( - _selectedShipmentBox.shipmentNumber == null - ? "" - : _selectedShipmentBox.shipmentNumber, + _selectedShipmentBox.shipmentNumber ?? "", style: textStyle, )), new Text( - _selectedShipmentBox.desc == null ? "" : _selectedShipmentBox.desc, + _selectedShipmentBox.desc ?? "", style: textStyle, ), ], @@ -216,7 +215,7 @@ class _DeliveryInfoState extends State { ); final shipmentWeightBox = DisplayText( - text: shipmentWeight != null ? shipmentWeight.toStringAsFixed(0) : "", + text: shipmentWeight.toStringAsFixed(0), labelTextKey: "box.shipment_weight", iconData: MaterialCommunityIcons.weight, ); @@ -302,7 +301,7 @@ class _DeliveryInfoState extends State { }); try { var deliveryModel = Provider.of(context, listen: false); - await deliveryModel.deliver(widget.box); + await deliveryModel.deliver(this._box); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/delivery/delivery_list_row.dart b/lib/pages/delivery/delivery_list_row.dart index 16bdcac..c77f115 100644 --- a/lib/pages/delivery/delivery_list_row.dart +++ b/lib/pages/delivery/delivery_list_row.dart @@ -3,14 +3,14 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'delivery_info.dart'; class DeliveryListRow extends StatelessWidget { - final Carton box; - DeliveryListRow({Key key, this.box}) : super(key: key); + final Carton? box; + DeliveryListRow({Key? key, this.box}) : super(key: key); final double dotSize = 15.0; final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); @@ -19,10 +19,11 @@ class DeliveryListRow extends StatelessWidget { Widget build(BuildContext context) { return InkWell( onTap: () { - Navigator.push( - context, - CupertinoPageRoute(builder: (context) => DeliveryInfo(box: box)), - ); + if (box != null) + Navigator.push( + context, + CupertinoPageRoute(builder: (context) => DeliveryInfo(box: box!)), + ); }, child: Container( padding: EdgeInsets.only(left: 15, right: 15), @@ -48,7 +49,7 @@ class DeliveryListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - box.cartonNumber ?? "", + box?.cartonNumber ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -56,7 +57,7 @@ class DeliveryListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 10.0, top: 10), child: new Text( - box.userName ?? "", + box?.userName ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), @@ -72,14 +73,14 @@ class DeliveryListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(0), - child: getStatus(box.status == null ? "" : box.status), + child: getStatus(box?.status ?? ''), ), Padding( padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5), child: Row( children: [ new Text( - "${box.actualWeight?.toString() ?? ''} lb", + "${box?.actualWeight.toString() ?? ''} lb", style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/delivery/model/delivery_model.dart b/lib/pages/delivery/model/delivery_model.dart index b200684..235f820 100644 --- a/lib/pages/delivery/model/delivery_model.dart +++ b/lib/pages/delivery/model/delivery_model.dart @@ -14,18 +14,18 @@ class DeliveryModel extends BaseModel { List get cartons => _selectedIndex == 1 ? _cartons : List.from(_delivered.values); - Paginator _delivered; + late Paginator _delivered; int _selectedIndex = 1; bool isLoading = false; List _cartons = []; - StreamSubscription listener; + StreamSubscription? listener; set selectedIndex(int index) { _selectedIndex = index; notifyListeners(); } - get selectedIndex => _selectedIndex; + int get selectedIndex => _selectedIndex; initData() { _selectedIndex = 1; @@ -37,12 +37,12 @@ class DeliveryModel extends BaseModel { } Future _loadCartons() async { - if (user == null || !user.hasDeliveries()) return; + if (user == null || !user!.hasDeliveries()) return; String path = "/$cartons_collection/"; - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); _cartons = []; try { - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("$path") .where("status", isEqualTo: carton_shipped_status) .where("carton_type", whereIn: [ @@ -55,9 +55,9 @@ class DeliveryModel extends BaseModel { .snapshots() .listen((QuerySnapshot snapshot) { _cartons.clear(); - _cartons = snapshot.documents.map((documentSnapshot) { + _cartons = snapshot.docs.map((documentSnapshot) { var s = Carton.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, documentSnapshot.id); return s; }).toList(); notifyListeners(); @@ -68,9 +68,9 @@ class DeliveryModel extends BaseModel { } Paginator _getDelivered() { - if (user == null || !user.hasDeliveries()) return null; + if (user == null || !user!.hasDeliveries()) throw "No Privilege"; - var pageQuery = Firestore.instance + var pageQuery = FirebaseFirestore.instance .collection("/$cartons_collection") .where("is_delivered", isEqualTo: true) .where("status", whereIn: [carton_delivered_status]).where("is_deleted", @@ -105,7 +105,7 @@ class DeliveryModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); if (_delivered != null) _delivered.close(); _cartons = []; } diff --git a/lib/pages/delivery_address/delivery_address_editor.dart b/lib/pages/delivery_address/delivery_address_editor.dart index 812e0db..aa84ba2 100644 --- a/lib/pages/delivery_address/delivery_address_editor.dart +++ b/lib/pages/delivery_address/delivery_address_editor.dart @@ -7,13 +7,13 @@ import 'package:fcs/pages/widgets/input_text.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter_icons/flutter_icons.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; class DeliveryAddressEditor extends StatefulWidget { - final DeliveryAddress deliveryAddress; - final User user; + final DeliveryAddress? deliveryAddress; + final User? user; DeliveryAddressEditor({this.deliveryAddress, this.user}); @override @@ -38,13 +38,13 @@ class _DeliveryAddressEditorState extends State { super.initState(); if (widget.deliveryAddress != null) { _isNew = false; - _deliveryAddress = widget.deliveryAddress; - _nameController.text = _deliveryAddress.fullName; - _address1Controller.text = _deliveryAddress.addressLine1; - _address2Controller.text = _deliveryAddress.addressLine2; - _cityController.text = _deliveryAddress.city; - _stateController.text = _deliveryAddress.state; - _phoneController.text = _deliveryAddress.phoneNumber; + _deliveryAddress = widget.deliveryAddress!; + _nameController.text = _deliveryAddress.fullName ?? ""; + _address1Controller.text = _deliveryAddress.addressLine1 ?? ""; + _address2Controller.text = _deliveryAddress.addressLine2 ?? ""; + _cityController.text = _deliveryAddress.city ?? ""; + _stateController.text = _deliveryAddress.state ?? ""; + _phoneController.text = _deliveryAddress.phoneNumber?? ""; } else { _cityController.text = "Yangon"; _stateController.text = "Yangon"; @@ -198,7 +198,7 @@ class _DeliveryAddressEditorState extends State { return; } if (widget.user != null) { - deliveryAddress.userID = widget.user.id; + deliveryAddress.userID = widget.user!.id; } setState(() { _isLoading = true; @@ -224,7 +224,7 @@ class _DeliveryAddressEditorState extends State { return; } if (widget.user != null) { - deliveryAddress.userID = widget.user.id; + deliveryAddress.userID = widget.user!.id; } setState(() { _isLoading = true; @@ -255,7 +255,7 @@ class _DeliveryAddressEditorState extends State { DeliveryAddressModel deliveryAddressModel = Provider.of(context, listen: false); if (widget.user != null) { - _deliveryAddress.userID = widget.user.id; + _deliveryAddress.userID = widget.user!.id; } await deliveryAddressModel.deleteDeliveryAddress(_deliveryAddress); Navigator.pop(context, true); @@ -278,7 +278,7 @@ class _DeliveryAddressEditorState extends State { _stateController.text != "Yangon"; } else { DeliveryAddress deliveryAddress = _getPayload(); - return widget.deliveryAddress.isChangedForEdit(deliveryAddress); + return this._deliveryAddress.isChangedForEdit(deliveryAddress); } } } diff --git a/lib/pages/delivery_address/delivery_address_list.dart b/lib/pages/delivery_address/delivery_address_list.dart index c8455ba..480e5b6 100644 --- a/lib/pages/delivery_address/delivery_address_list.dart +++ b/lib/pages/delivery_address/delivery_address_list.dart @@ -13,9 +13,9 @@ import 'model/delivery_address_model.dart'; class DeliveryAddressList extends StatefulWidget { final bool isAdminCreation; - final DeliveryAddress deliveryAddress; + final DeliveryAddress? deliveryAddress; const DeliveryAddressList( - {Key key, this.isAdminCreation = false, this.deliveryAddress}) + {Key? key, this.isAdminCreation = false, this.deliveryAddress}) : super(key: key); @override _DeliveryAddressListState createState() => _DeliveryAddressListState(); @@ -85,7 +85,7 @@ class _DeliveryAddressListState extends State { padding: const EdgeInsets.all(10.0), child: Icon(Icons.check, color: widget.isAdminCreation - ? widget.deliveryAddress.id == deliveryAddress.id + ? widget.deliveryAddress?.id == deliveryAddress.id ? primaryColor : Colors.black26 : deliveryAddress.isDefault diff --git a/lib/pages/delivery_address/delivery_address_row.dart b/lib/pages/delivery_address/delivery_address_row.dart index e596213..c6e248c 100644 --- a/lib/pages/delivery_address/delivery_address_row.dart +++ b/lib/pages/delivery_address/delivery_address_row.dart @@ -3,15 +3,15 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; typedef SelectionCallback(DeliveryAddress deliveryAddress); class DeliveryAddressRow extends StatelessWidget { final DeliveryAddress deliveryAddress; - final SelectionCallback selectionCallback; + final SelectionCallback? selectionCallback; const DeliveryAddressRow( - {Key key, this.deliveryAddress, this.selectionCallback}) + {Key? key, required this.deliveryAddress, this.selectionCallback}) : super(key: key); @override @@ -19,7 +19,7 @@ class DeliveryAddressRow extends StatelessWidget { return InkWell( onTap: selectionCallback == null ? null - : () => this.selectionCallback(deliveryAddress), + : () => this.selectionCallback!(deliveryAddress), child: Row( children: [ Expanded( @@ -54,8 +54,8 @@ class DeliveryAddressRow extends StatelessWidget { ); } - Widget line(BuildContext context, String text, - {IconData iconData, Color color, double fontSize}) { + Widget line(BuildContext context, String? text, + {IconData? iconData, Color? color, double? fontSize}) { return Row( children: [ iconData == null @@ -69,7 +69,7 @@ class DeliveryAddressRow extends StatelessWidget { context, text ?? "", fontSize: fontSize ?? 14, - color: color, + color: color ?? Colors.grey, ), ), ], diff --git a/lib/pages/delivery_address/model/delivery_address_model.dart b/lib/pages/delivery_address/model/delivery_address_model.dart index a344c82..0ccbf33 100644 --- a/lib/pages/delivery_address/model/delivery_address_model.dart +++ b/lib/pages/delivery_address/model/delivery_address_model.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:barcode_scan2/gen/protos/protos.pb.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/data/services/services.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; @@ -10,13 +11,13 @@ class DeliveryAddressModel extends BaseModel { final log = Logger('FcsShipmentModel'); List deliveryAddresses = []; - StreamSubscription listener; + StreamSubscription? listener; DeliveryAddress get defalutAddress => - deliveryAddresses.firstWhere((e) => e.isDefault, orElse: () => null); + deliveryAddresses.firstWhere((e) => e.isDefault, orElse: () => DeliveryAddress()); DeliveryAddress getLocalDeliveryAddress(String id) => - deliveryAddresses.firstWhere((e) => e.id == id, orElse: () => null); + deliveryAddresses.firstWhere((e) => e.id == id, orElse: () => DeliveryAddress()); @override void privilegeChanged() { @@ -26,26 +27,26 @@ class DeliveryAddressModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); deliveryAddresses = []; } Future _loadDeliveryAddresses() async { if (user == null) return; String path = "$delivery_address_collection/"; - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); deliveryAddresses = []; try { - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection('users') - .document("${user.id}") + .doc("${user!.id}") .collection("$path") .snapshots() .listen((QuerySnapshot snapshot) { deliveryAddresses.clear(); - deliveryAddresses = snapshot.documents.map((documentSnapshot) { + deliveryAddresses = snapshot.docs.map((documentSnapshot) { var s = DeliveryAddress.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, documentSnapshot.id); return s; }).toList(); notifyListeners(); @@ -56,9 +57,9 @@ class DeliveryAddressModel extends BaseModel { } Future getDeliveryAddress(String id) async { - String path = "/$user_collection/${user.id}/$delivery_address_collection"; - var snap = await Firestore.instance.collection(path).document(id).get(); - return DeliveryAddress.fromMap(snap.data, snap.documentID); + String path = "/$user_collection/${user!.id}/$delivery_address_collection"; + var snap = await FirebaseFirestore.instance.collection(path).doc(id).get(); + return DeliveryAddress.fromMap(snap.data as Map, snap.id); } void initUser(user) { @@ -87,14 +88,14 @@ class DeliveryAddressModel extends BaseModel { Future> getDeliveryAddresses(String userID) async { String path = "$delivery_address_collection/"; - var querySnap = await Firestore.instance + var querySnap = await FirebaseFirestore.instance .collection('users') - .document("$userID") + .doc("$userID") .collection("$path") .orderBy("full_name") - .getDocuments(); - return querySnap.documents - .map((e) => DeliveryAddress.fromMap(e.data, e.documentID)) + .get(); + return querySnap.docs + .map((e) => DeliveryAddress.fromMap(e.data as Map, e.id)) .toList(); } } diff --git a/lib/pages/discount/discount_editor.dart b/lib/pages/discount/discount_editor.dart index d967cb5..3b66baf 100644 --- a/lib/pages/discount/discount_editor.dart +++ b/lib/pages/discount/discount_editor.dart @@ -1,24 +1,22 @@ import 'package:fcs/domain/entities/discount.dart'; -import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/discount/model/discount_model.dart'; import 'package:fcs/pages/main/util.dart'; -import 'package:fcs/pages/rates/model/shipment_rate_model.dart'; import 'package:fcs/pages/user_search/user_serach.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/input_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; class DiscountEditor extends StatefulWidget { - final Discount discount; + final Discount? discount; - const DiscountEditor({Key key, this.discount}) : super(key: key); + const DiscountEditor({Key? key, this.discount}) : super(key: key); @override _DiscountEditorState createState() => _DiscountEditorState(); } @@ -38,12 +36,12 @@ class _DiscountEditorState extends State { void initState() { super.initState(); if (widget.discount != null) { - _discount = widget.discount; - _codeController.text = _discount.code; + _discount = widget.discount!; + _codeController.text = _discount.code ?? ""; _amountController.text = _discount.amount.toStringAsFixed(2); - _statusController.text = _discount.status; - customerName = widget.discount.customerName; - customerId = widget.discount.customerId; + _statusController.text = _discount.status ?? ''; + customerName = _discount.customerName ?? ""; + customerId = _discount.customerId ?? ""; } else { _isNew = true; } @@ -71,7 +69,7 @@ class _DiscountEditorState extends State { children: [ Expanded( child: DisplayText( - text: customerName != null ? customerName : "", + text: customerName, labelTextKey: "discount.name", iconData: Feather.user, )), @@ -79,8 +77,8 @@ class _DiscountEditorState extends State { icon: Icon(Icons.search, color: primaryColor), onPressed: () => searchUser(context, onUserSelect: (u) { setState(() { - customerId = u.id; - customerName = u.name; + customerId = u.id ?? ""; + customerName = u.name ?? ""; }); },popPage: true)), ], @@ -93,7 +91,7 @@ class _DiscountEditorState extends State { appBar: AppBar( centerTitle: true, title: Text( - AppTranslations.of(context).text("discount.form"), + AppTranslations.of(context)!.text("discount.form"), ), leading: new IconButton( icon: new Icon(CupertinoIcons.back), @@ -162,7 +160,7 @@ class _DiscountEditorState extends State { if (_isNew) { await discountModel.addDiscount(_discount); } else { - _discount.id = widget.discount.id; + _discount.id = this._discount.id; await discountModel.updateDiscount(_discount); } Navigator.pop(context); @@ -186,7 +184,7 @@ class _DiscountEditorState extends State { }); try { var discountModel = Provider.of(context, listen: false); - await discountModel.deleteDiscount(widget.discount); + await discountModel.deleteDiscount(_discount); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -208,7 +206,7 @@ class _DiscountEditorState extends State { customerName: customerName, customerId: customerId, amount: double.parse(_amountController.text)); - return widget.discount.isChangedForEdit(_discount); + return widget.discount!.isChangedForEdit(_discount); } } } diff --git a/lib/pages/discount/discount_list.dart b/lib/pages/discount/discount_list.dart index ca2845a..466f800 100644 --- a/lib/pages/discount/discount_list.dart +++ b/lib/pages/discount/discount_list.dart @@ -16,7 +16,7 @@ import 'discount_editor.dart'; class DiscountList extends StatefulWidget { final bool selectionMode; - const DiscountList({Key key, this.selectionMode = false}) : super(key: key); + const DiscountList({Key? key, this.selectionMode = false}) : super(key: key); @override _DiscountListState createState() => _DiscountListState(); } @@ -62,7 +62,7 @@ class _DiscountListState extends State { appBar: AppBar( centerTitle: true, title: Text( - AppTranslations.of(context).text("discount.title"), + AppTranslations.of(context)!.text("discount.title"), ), leading: new IconButton( icon: new Icon(CupertinoIcons.back), diff --git a/lib/pages/discount/discount_list_row.dart b/lib/pages/discount/discount_list_row.dart index 868905d..b2702b2 100644 --- a/lib/pages/discount/discount_list_row.dart +++ b/lib/pages/discount/discount_list_row.dart @@ -5,15 +5,15 @@ import 'package:fcs/pages/discount/discount_editor.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; typedef OnSelect(Discount discount); class DiscountListRow extends StatelessWidget { - final OnSelect onSelect; - final Discount discount; - DiscountListRow({Key key, this.discount, this.onSelect}) : super(key: key); + final OnSelect? onSelect; + final Discount? discount; + DiscountListRow({Key? key, this.discount, this.onSelect}) : super(key: key); final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); @@ -21,8 +21,8 @@ class DiscountListRow extends StatelessWidget { Widget build(BuildContext context) { return InkWell( onTap: () { - if (onSelect != null) { - onSelect(discount); + if (onSelect != null && discount != null) { + onSelect!(discount!); } }, child: Container( @@ -49,7 +49,7 @@ class DiscountListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - discount.code ?? "", + discount?.code ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -57,7 +57,7 @@ class DiscountListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 10.0, top: 10), child: new Text( - discount.customerName ?? "", + discount?.customerName ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), @@ -73,14 +73,14 @@ class DiscountListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(0), - child: Text(discount.status), + child: Text(discount?.status ?? ''), ), Padding( padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5), child: Row( children: [ new Text( - "${discount.amount.toStringAsFixed(2) ?? ''}", + "${discount?.amount.toStringAsFixed(2) ?? ''}", style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/discount/model/discount_model.dart b/lib/pages/discount/model/discount_model.dart index 5a25660..df50e03 100644 --- a/lib/pages/discount/model/discount_model.dart +++ b/lib/pages/discount/model/discount_model.dart @@ -11,13 +11,13 @@ import 'package:logging/logging.dart'; class DiscountModel extends BaseModel { final log = Logger('DiscountModel'); - StreamSubscription listener; + StreamSubscription? listener; List _discounts = []; List get discounts => _selectedIndex == 1 ? _discounts : List.from(_used.values); - Paginator _used; + late Paginator _used; bool isLoading = false; int _selectedIndex = 1; set selectedIndex(int index) { @@ -25,14 +25,12 @@ class DiscountModel extends BaseModel { notifyListeners(); } - get selectedIndex => _selectedIndex; + int get selectedIndex => _selectedIndex; initData() { _selectedIndex = 1; _load(); - - if (_used != null) _used.close(); - _used = _getUsed(); + if (_getUsed() != null) _used = _getUsed(); _used.load(); } @@ -42,16 +40,16 @@ class DiscountModel extends BaseModel { } _load() { - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); try { - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("/$discounts_collection") .orderBy("code", descending: false) .snapshots() .listen((snaps) { _discounts.clear(); - snaps.documents.forEach((d) { - _discounts.add(Discount.fromMap(d.data, d.documentID)); + snaps.docs.forEach((d) { + _discounts.add(Discount.fromMap(d.data as Map, d.id)); }); notifyListeners(); }); @@ -61,9 +59,9 @@ class DiscountModel extends BaseModel { } Paginator _getUsed() { - if (user == null || !user.hasFcsShipments()) return null; + if (user == null || !user!.hasFcsShipments()) throw "No Privilege"; - var pageQuery = Firestore.instance + var pageQuery = FirebaseFirestore.instance .collection("/$discounts_collection") .where("status", isEqualTo: fcs_shipment_shipped_status) .orderBy("code", descending: false); @@ -73,17 +71,17 @@ class DiscountModel extends BaseModel { return paginator; } - Future> getDiscount(String userID) async { + Future?> getDiscount(String userID) async { String path = "/$discounts_collection"; try { - var q = Firestore.instance + var q = FirebaseFirestore.instance .collection("$path") .where("customer_id", isEqualTo: userID) .where("status", isEqualTo: "available"); - var snaps = await q.getDocuments(source: Source.server); - List discounts = snaps.documents.map((snap) { + var snaps = await q.get(const GetOptions(source: Source.server)); + var discounts = snaps.docs.map((snap) { if (snap.exists) { - var s = Discount.fromMap(snap.data, snap.documentID); + var s = Discount.fromMap(snap.data as Map, snap.id); return s; } }).toList(); @@ -113,7 +111,7 @@ class DiscountModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); if (_used != null) _used.close(); _discounts = []; @@ -128,6 +126,6 @@ class DiscountModel extends BaseModel { } Future deleteDiscount(Discount discount) async { - return Services.instance.commonService.deleteDiscount(discount.id); + return Services.instance.commonService.deleteDiscount(discount.id!); } } diff --git a/lib/pages/faq/faq_detail_page.dart b/lib/pages/faq/faq_detail_page.dart index 8a4124f..d2bd99c 100644 --- a/lib/pages/faq/faq_detail_page.dart +++ b/lib/pages/faq/faq_detail_page.dart @@ -13,14 +13,14 @@ import 'package:provider/provider.dart'; class FAQDetailPage extends StatefulWidget { final FAQ faq; - const FAQDetailPage({this.faq}); + const FAQDetailPage({required this.faq}); @override _FAQDetailPageState createState() => _FAQDetailPageState(); } class _FAQDetailPageState extends State { bool _isLoading = false; - FAQ faq; + FAQ faq = new FAQ(); intState() { super.initState(); @@ -28,7 +28,8 @@ class _FAQDetailPageState extends State { @override Widget build(BuildContext context) { - faq = context.select((FAQModel m) => m.getFAQ(widget.faq.id)); + if(widget.faq.id != null) + faq = context.select((FAQModel m) => m.getFAQ(widget.faq.id!)); if (faq == null) return Text("Deleted"); bool isEditable = context.select((MainModel m) => m.faqEditable()); diff --git a/lib/pages/faq/faq_edit_page.dart b/lib/pages/faq/faq_edit_page.dart index 73045be..d56471c 100644 --- a/lib/pages/faq/faq_edit_page.dart +++ b/lib/pages/faq/faq_edit_page.dart @@ -10,13 +10,13 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; const info = "Select additional page"; class FAQEditor extends StatefulWidget { - final FAQ faq; + final FAQ? faq; const FAQEditor({this.faq}); @override _FAQEditorState createState() => _FAQEditorState(); @@ -35,20 +35,22 @@ class _FAQEditorState extends State { bool _isLoading = false; bool _isNew = false; String _pageLink = info; + FAQ _faq = new FAQ(); @override void initState() { super.initState(); _isNew = widget.faq == null; if (widget.faq != null) { - _sn.text = widget.faq.sn.toString(); - _engQ.text = widget.faq.questionEng; - _mmQ.text = widget.faq.questionMm; - _engA.text = widget.faq.answerEng; - _mmA.text = widget.faq.answerMm; - _pageLabelEng.text = widget.faq.pageLinkLabelEng; - _pageLabelMm.text = widget.faq.pageLinkLabelMm; - _pageLink = widget.faq.pageLink; + _faq = widget.faq!; + _sn.text = _faq.sn.toString(); + _engQ.text = _faq.questionEng ?? ""; + _mmQ.text = _faq.questionMm ?? ''; + _engA.text = _faq.answerEng ?? ''; + _mmA.text = _faq.answerMm ?? ''; + _pageLabelEng.text = _faq.pageLinkLabelEng ?? ""; + _pageLabelMm.text = _faq.pageLinkLabelMm ?? ""; + _pageLink = _faq.pageLink ?? ''; } } @@ -89,7 +91,8 @@ class _FAQEditorState extends State { height: 2, color: primaryColor, ), - onChanged: (String newValue) { + onChanged: (String? newValue) { + if(newValue != null) setState(() { _pageLink = newValue; }); @@ -211,7 +214,7 @@ class _FAQEditorState extends State { if (_isNew) { await faqModel.addFAQ(_faq); } else { - _faq.id = widget.faq.id; + _faq.id = this._faq.id; await faqModel.updateFAQ(_faq); } Navigator.pop(context); @@ -234,7 +237,7 @@ class _FAQEditorState extends State { }); try { FAQModel faqModel = Provider.of(context, listen: false); - await faqModel.deleteFAQ(widget.faq); + await faqModel.deleteFAQ(this._faq); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/faq/faq_list_page.dart b/lib/pages/faq/faq_list_page.dart index 2c5ae2d..1e8bc36 100644 --- a/lib/pages/faq/faq_list_page.dart +++ b/lib/pages/faq/faq_list_page.dart @@ -1,14 +1,12 @@ import 'package:fcs/domain/constants.dart'; import 'package:fcs/domain/entities/faq.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/buying_instruction/buying_online.dart'; import 'package:fcs/pages/faq/faq_edit_page.dart'; import 'package:fcs/pages/main/model/language_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/payment_methods/payment_method_page.dart'; import 'package:fcs/pages/rates/shipment_rates.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/fcs_expansion_tile.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; @@ -26,8 +24,8 @@ class FAQListPage extends StatefulWidget { class _FAQListPageState extends State with SingleTickerProviderStateMixin { - AnimationController _controller; - Animation _iconTurns; + AnimationController? _controller; + Animation? _iconTurns; @override void initState() { @@ -35,7 +33,7 @@ class _FAQListPageState extends State _controller = AnimationController(duration: _kExpand, vsync: this); var _halfTween = Tween(begin: 0.0, end: 0.5); var _easeInTween = CurveTween(curve: Curves.easeIn); - _iconTurns = _controller.drive(_halfTween.chain(_easeInTween)); + _iconTurns = _controller?.drive(_halfTween.chain(_easeInTween)); } @override @@ -139,7 +137,7 @@ class _FAQListPageState extends State ); } - Widget _pageLink(String linkPage, String text) { + Widget _pageLink(String? linkPage, String? text) { return linkPage == null || linkPage == "" || text == null || text == "" ? Container() : Row( diff --git a/lib/pages/faq/model/faq_model.dart b/lib/pages/faq/model/faq_model.dart index ece61b7..cc43d41 100644 --- a/lib/pages/faq/model/faq_model.dart +++ b/lib/pages/faq/model/faq_model.dart @@ -12,22 +12,22 @@ class FAQModel extends BaseModel { List faqs = []; FAQ getFAQ(String id) { - return faqs.firstWhere((e) => e.id == id, orElse: () => null); + return faqs.firstWhere((e) => e.id == id, orElse: () => FAQ()); } - StreamSubscription listener; + StreamSubscription? listener; FAQModel() { - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); try { - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("/faqs") .orderBy("sn", descending: false) .snapshots() .listen((snaps) { faqs.clear(); - snaps.documents.forEach((d) { - faqs.add(FAQ.fromMap(d.data, d.documentID)); + snaps.docs.forEach((d) { + faqs.add(FAQ.fromMap(d.data as Map, d.id)); }); notifyListeners(); }); diff --git a/lib/pages/faq/widgets.dart b/lib/pages/faq/widgets.dart index ba1c60a..a954882 100644 --- a/lib/pages/faq/widgets.dart +++ b/lib/pages/faq/widgets.dart @@ -7,14 +7,14 @@ Widget itemTitle(BuildContext context, String textKey) { return Padding( padding: const EdgeInsets.only(left: 18.0, top: 15, bottom: 0), child: Text( - AppTranslations.of(context).text(textKey), + AppTranslations.of(context)!.text(textKey), style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), ), ); } -Widget subItemTitle(BuildContext context, String textKey, {IconData iconData}) { +Widget subItemTitle(BuildContext context, String textKey, {IconData? iconData}) { return Padding( padding: const EdgeInsets.only(left: 0, top: 0, bottom: 0), child: Row( @@ -25,7 +25,7 @@ Widget subItemTitle(BuildContext context, String textKey, {IconData iconData}) { ), SizedBox(width: 10), Text( - AppTranslations.of(context).text(textKey), + AppTranslations.of(context)!.text(textKey), style: TextStyle( fontWeight: FontWeight.w700, fontSize: 15, color: primaryColor), ), @@ -35,7 +35,7 @@ Widget subItemTitle(BuildContext context, String textKey, {IconData iconData}) { } Widget contactItem(BuildContext context, String text, IconData iconData, - {Function() onTap, String labelKey}) { + {Function()? onTap, String? labelKey}) { return Material( child: Padding( padding: const EdgeInsets.only(left: 18.0, bottom: 10, right: 18), diff --git a/lib/pages/fcs_shipment/fcs_shipment_editor.dart b/lib/pages/fcs_shipment/fcs_shipment_editor.dart index 82feb2e..0a48598 100644 --- a/lib/pages/fcs_shipment/fcs_shipment_editor.dart +++ b/lib/pages/fcs_shipment/fcs_shipment_editor.dart @@ -12,7 +12,7 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -20,7 +20,7 @@ import 'package:provider/provider.dart'; import '../main/util.dart'; class FcsShipmentEditor extends StatefulWidget { - final FcsShipment shipment; + final FcsShipment? shipment; FcsShipmentEditor({this.shipment}); @override @@ -40,7 +40,7 @@ class _FcsShipmentEditorState extends State { FcsShipment _shipment = new FcsShipment(); bool _isLoading = false; - String _currentShipmentType; + String? _currentShipmentType; bool _isNew = false; @override @@ -48,20 +48,23 @@ class _FcsShipmentEditorState extends State { super.initState(); _isNew = widget.shipment == null; if (widget.shipment != null) { - _shipment = widget.shipment; - _shipmentNumberController.text = _shipment.shipmentNumber; - _cutoffDateController.text = dateFormatter.format(_shipment.cutoffDate); - _arrivalDateController.text = dateFormatter.format(_shipment.arrivalDate); + _shipment = widget.shipment!; + _shipmentNumberController.text = _shipment.shipmentNumber ?? ""; + if(_shipment.cutoffDate != null) + _cutoffDateController.text = dateFormatter.format(_shipment.cutoffDate!); + if(_shipment.arrivalDate != null) + _arrivalDateController.text = dateFormatter.format(_shipment.arrivalDate!); + if(_shipment.departureDate != null) _departureDateControler.text = - dateFormatter.format(_shipment.departureDate); - _statusController.text = _shipment.status; + dateFormatter.format(_shipment.departureDate!); + _statusController.text = _shipment.status ?? ""; _currentShipmentType = _shipment.shipType; - _consigneeController.text = _shipment.consignee; - _portController.text = _shipment.port; - _destinationController.text = _shipment.destination; + _consigneeController.text = _shipment.consignee ?? ""; + _portController.text = _shipment.port ?? ""; + _destinationController.text = _shipment.destination ?? ""; } else { var mainModel = Provider.of(context, listen: false); - _currentShipmentType = mainModel.setting.shipmentTypes[0]; + _currentShipmentType = mainModel.setting!.shipmentTypes[0]; } } @@ -143,13 +146,13 @@ class _FcsShipmentEditorState extends State { labelStyle: languageModel.isEng ? newLabelStyle(color: Colors.black54, fontSize: 20) : newLabelStyleMM(color: Colors.black54, fontSize: 20), - labelText: AppTranslations.of(context) + labelText: AppTranslations.of(context)! .text('FCSshipment.shipment_type'), icon: Icon(Ionicons.ios_airplane, color: primaryColor)), - items: mainModel.setting.shipmentTypes + items: mainModel.setting!.shipmentTypes .map((e) => DropdownMenuItem(child: Text(e), value: e)) .toList(), - onChanged: (selected) => { + onChanged: (String? selected) => { setState(() { _currentShipmentType = selected; }) @@ -188,7 +191,7 @@ class _FcsShipmentEditorState extends State { FcsShipment fcsShipment = FcsShipment(); fcsShipment.id = _shipment.id; fcsShipment.shipmentNumber = _shipmentNumberController.text; - fcsShipment.shipType = _currentShipmentType; + fcsShipment.shipType = _currentShipmentType!; fcsShipment.consignee = _consigneeController.text; fcsShipment.port = _portController.text; fcsShipment.destination = _destinationController.text; @@ -197,9 +200,9 @@ class _FcsShipmentEditorState extends State { var arrivalDate = _arrivalDateController.text; // var depDate = _departureDateControler.text; fcsShipment.cutoffDate = - cutoffDate == "" ? null : dateFormatter.parse(cutoffDate); + (cutoffDate == "" ? null : dateFormatter.parse(cutoffDate))!; fcsShipment.arrivalDate = - arrivalDate == "" ? null : dateFormatter.parse(arrivalDate); + (arrivalDate == "" ? null : dateFormatter.parse(arrivalDate))!; // fcsShipment.departureDate = // depDate == "" ? null : dateFormatter.parse(depDate); } catch (e) { @@ -285,10 +288,10 @@ class _FcsShipmentEditorState extends State { _consigneeController.text != "" || _portController.text != "" || _destinationController.text != "" || - _currentShipmentType != mainModel.setting.shipmentTypes[0]; + _currentShipmentType != mainModel.setting!.shipmentTypes[0]; } else { FcsShipment fcsShipment = _getPayload(); - return widget.shipment.isChangedForEdit(fcsShipment); + return widget.shipment!.isChangedForEdit(fcsShipment); } } } diff --git a/lib/pages/fcs_shipment/fcs_shipment_info.dart b/lib/pages/fcs_shipment/fcs_shipment_info.dart index 091fe30..ffd7723 100644 --- a/lib/pages/fcs_shipment/fcs_shipment_info.dart +++ b/lib/pages/fcs_shipment/fcs_shipment_info.dart @@ -11,7 +11,7 @@ import 'package:fcs/pages/widgets/popupmenu.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -19,7 +19,7 @@ import 'package:provider/provider.dart'; import 'fcs_shipment_editor.dart'; class FcsShipmentInfo extends StatefulWidget { - final FcsShipment fcsShipment; + final FcsShipment? fcsShipment; FcsShipmentInfo({this.fcsShipment}); @override @@ -28,7 +28,7 @@ class FcsShipmentInfo extends StatefulWidget { class _FcsShipmentInfoState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); - FcsShipment _fcsShipment; + FcsShipment? _fcsShipment; bool _isLoading = false; TextEditingController _shipmentNumberController = new TextEditingController(); TextEditingController _cutoffDateController = new TextEditingController(); @@ -48,17 +48,20 @@ class _FcsShipmentInfoState extends State { } _load() { - _shipmentNumberController.text = _fcsShipment.shipmentNumber; - _cutoffDateController.text = dateFormatter.format(_fcsShipment.cutoffDate); + _shipmentNumberController.text = _fcsShipment!.shipmentNumber ?? ""; + if(_fcsShipment!.cutoffDate != null) + _cutoffDateController.text = dateFormatter.format(_fcsShipment!.cutoffDate!); + if(_fcsShipment!.arrivalDate != null) _arrivalDateController.text = - dateFormatter.format(_fcsShipment.arrivalDate); + dateFormatter.format(_fcsShipment!.arrivalDate!); + if(_fcsShipment!.departureDate != null) _departureDateControler.text = - dateFormatter.format(_fcsShipment.departureDate); - _shipmentTypeControler.text = _fcsShipment.shipType; - _consigneeController.text = _fcsShipment.consignee; - _portController.text = _fcsShipment.port; - _destinationController.text = _fcsShipment.destination; - _statusController.text = _fcsShipment.status; + dateFormatter.format(_fcsShipment!.departureDate!); + _shipmentTypeControler.text = _fcsShipment!.shipType ?? ""; + _consigneeController.text = _fcsShipment!.consignee ?? ""; + _portController.text = _fcsShipment!.port ?? ""; + _destinationController.text = _fcsShipment!.destination ?? ""; + _statusController.text = _fcsShipment!.status ?? ""; } @override @@ -166,7 +169,7 @@ class _FcsShipmentInfoState extends State { portBox, destinationBox, statusBox, - _fcsShipment.status == fcs_shipment_confirmed_status + _fcsShipment!.status == fcs_shipment_confirmed_status ? shipBtn : Container(), SizedBox( @@ -182,14 +185,16 @@ class _FcsShipmentInfoState extends State { } _edit() async { - bool updated = await Navigator.push( + var f; + bool? updated = await Navigator.push( context, CupertinoPageRoute( builder: (context) => FcsShipmentEditor(shipment: _fcsShipment)), ); if (updated ?? false) { var shipmentModel = Provider.of(context, listen: false); - var f = await shipmentModel.getFcsShipment(_fcsShipment.id); + if(_fcsShipment != null && _fcsShipment!.id != null ) + f = await shipmentModel.getFcsShipment(_fcsShipment!.id!); setState(() { _fcsShipment = f; }); @@ -238,7 +243,7 @@ class _FcsShipmentInfoState extends State { try { FcsShipmentModel fcsShipmentModel = Provider.of(context, listen: false); - await fcsShipmentModel.ship(_fcsShipment); + await fcsShipmentModel.ship(_fcsShipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -264,11 +269,11 @@ class _FcsShipmentInfoState extends State { } else if (id == 4) { reportName = "manifest"; } - _fcsShipment.reportName = reportName; + _fcsShipment!.reportName = reportName; FcsShipmentModel fcsShipmentModel = Provider.of(context, listen: false); - String url = await fcsShipmentModel.report(_fcsShipment); + String url = await fcsShipmentModel.report(_fcsShipment!); Navigator.of(context).push(CupertinoPageRoute( builder: (context) => PDFScreen( title: "", diff --git a/lib/pages/fcs_shipment/fcs_shipment_list_row.dart b/lib/pages/fcs_shipment/fcs_shipment_list_row.dart index 020b304..b16e410 100644 --- a/lib/pages/fcs_shipment/fcs_shipment_list_row.dart +++ b/lib/pages/fcs_shipment/fcs_shipment_list_row.dart @@ -3,14 +3,14 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'fcs_shipment_info.dart'; class FcsShipmentListRow extends StatelessWidget { - final FcsShipment shipment; + final FcsShipment? shipment; final dateFormatter = new DateFormat('dd MMM yyyy'); - FcsShipmentListRow({Key key, this.shipment}) : super(key: key); + FcsShipmentListRow({Key? key, this.shipment}) : super(key: key); @override Widget build(BuildContext context) { @@ -43,9 +43,7 @@ class FcsShipmentListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - shipment.shipmentNumber == null - ? '' - : shipment.shipmentNumber, + shipment?.shipmentNumber ?? '', style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -53,7 +51,7 @@ class FcsShipmentListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 10.0, top: 10), child: new Text( - dateFormatter.format(shipment.cutoffDate), + dateFormatter.format(shipment!.cutoffDate!), style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), @@ -67,7 +65,7 @@ class FcsShipmentListRow extends StatelessWidget { ), Padding( padding: const EdgeInsets.all(0), - child: getStatus(shipment.status), + child: getStatus(shipment!.status ?? ''), ), ], ), diff --git a/lib/pages/fcs_shipment/model/fcs_shipment_model.dart b/lib/pages/fcs_shipment/model/fcs_shipment_model.dart index aaf40a4..45d2141 100644 --- a/lib/pages/fcs_shipment/model/fcs_shipment_model.dart +++ b/lib/pages/fcs_shipment/model/fcs_shipment_model.dart @@ -11,13 +11,13 @@ import 'package:logging/logging.dart'; class FcsShipmentModel extends BaseModel { final log = Logger('FcsShipmentModel'); - StreamSubscription listener; + StreamSubscription? listener; List _fcsShipments = []; List get fcsShipments => _selectedIndex == 1 ? _fcsShipments : List.from(_shipped.values); - Paginator _shipped; + late Paginator _shipped; bool isLoading = false; int _selectedIndex = 1; set selectedIndex(int index) { @@ -25,7 +25,7 @@ class FcsShipmentModel extends BaseModel { notifyListeners(); } - get selectedIndex => _selectedIndex; + int get selectedIndex => _selectedIndex; @override void privilegeChanged() { @@ -43,12 +43,12 @@ class FcsShipmentModel extends BaseModel { } Future _loadFcsShipments() async { - if (user == null || !user.hasFcsShipments()) return; + if (user == null || !user!.hasFcsShipments()) throw "No Privilege"; String path = "/$fcs_shipment_collection/"; - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); _fcsShipments = []; try { - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("$path") .where("status", isEqualTo: fcs_shipment_confirmed_status) .where("is_deleted", isEqualTo: false) @@ -56,9 +56,9 @@ class FcsShipmentModel extends BaseModel { .snapshots() .listen((QuerySnapshot snapshot) { _fcsShipments.clear(); - _fcsShipments = snapshot.documents.map((documentSnapshot) { + _fcsShipments = snapshot.docs.map((documentSnapshot) { var s = FcsShipment.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, documentSnapshot.id); return s; }).toList(); notifyListeners(); @@ -69,9 +69,9 @@ class FcsShipmentModel extends BaseModel { } Paginator _getShipped() { - if (user == null || !user.hasFcsShipments()) return null; + if (user == null || !user!.hasFcsShipments()) throw "No Privilege"; - var pageQuery = Firestore.instance + var pageQuery = FirebaseFirestore.instance .collection("/$fcs_shipment_collection") .where("status", isEqualTo: fcs_shipment_shipped_status) .where("is_deleted", isEqualTo: false) @@ -102,13 +102,13 @@ class FcsShipmentModel extends BaseModel { Future> getActiveFcsShipments() async { List fcsShipments = []; try { - var snaps = await Firestore.instance + var snaps = await FirebaseFirestore.instance .collection("/$fcs_shipment_collection") .where("status", isEqualTo: fcs_shipment_confirmed_status) - .getDocuments(source: Source.server); - fcsShipments = snaps.documents.map((documentSnapshot) { + .get(const GetOptions(source: Source.server)); + fcsShipments = snaps.docs.map((documentSnapshot) { var fcs = FcsShipment.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, documentSnapshot.id); return fcs; }).toList(); } catch (e) { @@ -117,13 +117,13 @@ class FcsShipmentModel extends BaseModel { return fcsShipments; } - Future getFcsShipment(String id) async { + Future getFcsShipment(String id) async { try { - var snap = await Firestore.instance + var snap = await FirebaseFirestore.instance .collection("/$fcs_shipment_collection") - .document(id) - .get(source: Source.server); - var fcs = FcsShipment.fromMap(snap.data, snap.documentID); + .doc(id) + .get(const GetOptions(source: Source.server)); + var fcs = FcsShipment.fromMap(snap.data as Map, snap.id); return fcs; } catch (e) { @@ -135,13 +135,13 @@ class FcsShipmentModel extends BaseModel { Future> getInvoiceFcsShipments() async { List fcsShipments = []; try { - var snaps = await Firestore.instance + var snaps = await FirebaseFirestore.instance .collection("/$fcs_shipment_collection") .where("pending_invoice_user_count", isGreaterThan: 0) - .getDocuments(source: Source.server); - fcsShipments = snaps.documents.map((documentSnapshot) { + .get(const GetOptions(source: Source.server)); + fcsShipments = snaps.docs.map((documentSnapshot) { var fcs = FcsShipment.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, documentSnapshot.id); return fcs; }).toList(); } catch (e) { @@ -156,7 +156,7 @@ class FcsShipmentModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); if (_shipped != null) _shipped.close(); _fcsShipments = []; } diff --git a/lib/pages/invoice/box_addition.dart b/lib/pages/invoice/box_addition.dart index 5429589..805979f 100644 --- a/lib/pages/invoice/box_addition.dart +++ b/lib/pages/invoice/box_addition.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class BoxAddition extends StatefulWidget { - final Carton box; + final Carton? box; BoxAddition({this.box}); @override @@ -23,7 +23,7 @@ class _BoxAdditionState extends State { void initState() { super.initState(); if (widget.box != null) { - _box = widget.box; + _box = widget.box!; } } @@ -45,7 +45,7 @@ class _BoxAdditionState extends State { onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("box.edit.title")), + title: Text(AppTranslations.of(context)!.text("box.edit.title")), ), body: Card( child: Column( @@ -54,7 +54,7 @@ class _BoxAdditionState extends State { child: Padding( padding: const EdgeInsets.all(10.0), child: ListView(children: [ - DropdownButtonFormField( + DropdownButtonFormField( decoration: InputDecoration( fillColor: Colors.white, labelText: 'Box Number', diff --git a/lib/pages/invoice/editor/invoice_carton_table.dart b/lib/pages/invoice/editor/invoice_carton_table.dart index 77f05ec..6faf7c8 100644 --- a/lib/pages/invoice/editor/invoice_carton_table.dart +++ b/lib/pages/invoice/editor/invoice_carton_table.dart @@ -9,11 +9,11 @@ import 'package:flutter/material.dart'; typedef OnSelect = Function(Carton carton, bool checked); class InvoiceCartonTable extends StatelessWidget { - final List cartons; - final OnSelect onSelect; - final Rate rate; + final List? cartons; + final OnSelect? onSelect; + final Rate? rate; - const InvoiceCartonTable({Key key, this.cartons, this.onSelect, this.rate}) + const InvoiceCartonTable({Key? key, this.cartons, this.onSelect, this.rate}) : super(key: key); @override @@ -36,27 +36,27 @@ class InvoiceCartonTable extends StatelessWidget { final rows = cartons == null ? [Container()] - : cartons.asMap().entries.map((p) { + : cartons!.asMap().entries.map((p) { return Container( - color: p.value.isChecked + color: p.value.isChecked! ? Colors.grey.withOpacity(0.2) - : Colors.grey[50].withOpacity(0.2), + : Colors.grey.shade50.withOpacity(0.2), child: Container( padding: EdgeInsets.only( left: 0.0, right: 10.0, top: 3.0, bottom: 3.0), decoration: BoxDecoration( border: Border( bottom: BorderSide( - color: p.key == cartons.length - 1 + color: p.key == cartons!.length - 1 ? Colors.white - : Colors.grey[350], + : Colors.grey.shade300, width: 1), ), ), child: Row( children: [ onSelect == null - ? p.value.isChecked + ? p.value.isChecked! ? SizedBox( child: Icon(Icons.check, color: primaryColor), width: 30) @@ -64,15 +64,15 @@ class InvoiceCartonTable extends StatelessWidget { : Checkbox( value: p.value.isChecked, activeColor: primaryColor, - onChanged: (bool check) { - if (onSelect != null) onSelect(p.value, check); + onChanged: (bool? check) { + if (onSelect != null) onSelect!(p.value, check!); }), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - p.value.cartonNumber, + p.value.cartonNumber!, style: textStyle, ), ], @@ -82,15 +82,15 @@ class InvoiceCartonTable extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( - "${p.value?.length ?? ""} x ${p.value?.width ?? ""} x ${p.value?.height ?? ""}", + "${p.value.length} x ${p.value.width} x ${p.value.height}", style: textStyle, ), new Text( - "${p.value?.getShipmentWeight(rate.volumetricRatio)?.toStringAsFixed(2) ?? "0"} lb", + "${p.value.getShipmentWeight(rate!.volumetricRatio).toStringAsFixed(2)} lb", style: textStyle, ), new Text( - "${p.value?.actualWeight?.toStringAsFixed(2) ?? "0"} lb (Actual)", + "${p.value.actualWeight.toStringAsFixed(2)} lb (Actual)", style: textStyle, ), ], diff --git a/lib/pages/invoice/editor/invoice_discount_list.dart b/lib/pages/invoice/editor/invoice_discount_list.dart index 13ad897..a86a056 100644 --- a/lib/pages/invoice/editor/invoice_discount_list.dart +++ b/lib/pages/invoice/editor/invoice_discount_list.dart @@ -6,10 +6,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class InvoiceDiscountList extends StatelessWidget { - final List discounts; + final List? discounts; const InvoiceDiscountList({ - Key key, + Key? key, this.discounts, }) : super(key: key); @@ -63,19 +63,19 @@ class InvoiceDiscountList extends StatelessWidget { if (discounts == null) { return []; } - var rows = discounts.map((c) { + var rows = discounts!.map((c) { return MyDataRow( onSelectChanged: (value) => Navigator.pop(context, c), cells: [ MyDataCell(new Text( - c.code ?? "", + c?.code ?? '', style: textStyle, )), MyDataCell( Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Text(c.amount?.toStringAsFixed(2) ?? "0", style: textStyle), + Text(c?.amount.toStringAsFixed(2) ?? "", style: textStyle), ], ), ), diff --git a/lib/pages/invoice/editor/invoice_editor.dart b/lib/pages/invoice/editor/invoice_editor.dart index 16f3420..99b5143 100644 --- a/lib/pages/invoice/editor/invoice_editor.dart +++ b/lib/pages/invoice/editor/invoice_editor.dart @@ -31,15 +31,15 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class InvoiceEditor extends StatefulWidget { - final Invoice invoice; - final User customer; - final FcsShipment fcsShipment; + final Invoice? invoice; + final User? customer; + final FcsShipment? fcsShipment; InvoiceEditor({this.invoice, this.customer, this.fcsShipment}); @override @@ -49,10 +49,10 @@ class InvoiceEditor extends StatefulWidget { class _InvoiceEditorState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); - Invoice _invoice; + Invoice? _invoice; bool _isLoading = false; - bool _isNew; - User _user; + bool _isNew = false; + User? _user; bool _showCartons = false; @override @@ -91,36 +91,36 @@ class _InvoiceEditorState extends State { _loadCartons() async { CartonModel cartonModel = Provider.of(context, listen: false); List cartons = await cartonModel.getCartonsForInvoice( - widget.fcsShipment.id, widget.customer.id); + widget.fcsShipment!.id!, widget.customer!.id!); cartons.forEach((c) { c.isChecked = true; }); setState(() { - _invoice.cartons = cartons; + _invoice!.cartons = cartons; }); } _loadShipments() async { ShipmentModel shipmentModel = Provider.of(context, listen: false); - List shipments = await shipmentModel.getShipmentWithHandlingFee( - widget.fcsShipment.id, widget.customer.id); - shipments.forEach((s) { - s.isSelected = true; + List? shipments = await shipmentModel.getShipmentWithHandlingFee( + widget.fcsShipment!.id!, widget.customer!.id!); + shipments!.forEach((s) { + s!.isSelected = true; }); setState(() { - _invoice.shipments = shipments; + _invoice!.shipments = shipments; }); } - List discounts = []; + List discounts = []; _loadDiscount() async { DiscountModel discountModel = Provider.of(context, listen: false); - discounts = await discountModel.getDiscount(widget.customer.id); + discounts = (await discountModel.getDiscount(widget.customer!.id!))!; if (discounts != null && discounts.length > 0) { setState(() { - _invoice.discount = discounts.first; + _invoice!.discount = discounts.first; }); } } @@ -146,7 +146,7 @@ class _InvoiceEditorState extends State { iconData: Icons.av_timer, labelTextKey: 'invoice.status'); final cartonTable = InvoiceCartonTable( - cartons: _invoice.cartons, + cartons: _invoice!.cartons, rate: rate, onSelect: (c, checked) { setState(() { @@ -157,30 +157,30 @@ class _InvoiceEditorState extends State { final paymentTypesBox = LocalDropdown( callback: (v) { setState(() { - _invoice.paymentMethod = v; + _invoice!.paymentMethod = v; }); }, labelKey: "invoice.payment_method", iconData: FontAwesome.money, display: (u) => u.name, - selectedValue: _invoice.paymentMethod, + selectedValue: _invoice!.paymentMethod, values: paymentMethodModel.paymentMethods, ); final invoiceTableBox = InvoiceTable( - invoice: _invoice, + invoice: _invoice!, rate: rate, deliveryFeeSelected: (selected) { setState(() { if (selected) { - _invoice.deliveryFee = rate.deliveryFee; + _invoice!.deliveryFee = rate.deliveryFee; } else { - _invoice.deliveryFee = 0; + _invoice!.deliveryFee = 0; } }); }, discountSelected: (discount) { setState(() { - _invoice.discount = discount; + _invoice!.discount = discount; }); }, onRemove: (i) { @@ -189,12 +189,12 @@ class _InvoiceEditorState extends State { } if (i.invoiceDataType == InvoiceDataType.DiscountDataType) { setState(() { - _invoice.discount = null; + _invoice!.discount = new Discount(); }); } if (i.invoiceDataType == InvoiceDataType.DeliveryFeeType) { setState(() { - _invoice.deliveryFee = 0; + _invoice!.deliveryFee = 0; }); } if (i.invoiceDataType == InvoiceDataType.HandlingFeeType) { @@ -254,7 +254,7 @@ class _InvoiceEditorState extends State { Shipment shipment = await Navigator.of(context).push( CupertinoPageRoute( builder: (context) => - InvoiceHandlingFeeList(shipments: _invoice.shipments))); + InvoiceHandlingFeeList(shipments: _invoice!.shipments))); _addShipment(shipment); } else if (p.id == 3) { Discount discount = @@ -264,12 +264,12 @@ class _InvoiceEditorState extends State { ))); if (discount != null) { setState(() { - _invoice.discount = discount; + _invoice!.discount = discount; }); } } else if (p.id == 4) { setState(() { - _invoice.deliveryFee = rate.deliveryFee; + _invoice!.deliveryFee = rate.deliveryFee; }); } }, @@ -281,7 +281,7 @@ class _InvoiceEditorState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(dateFormatter.format(_invoice.invoiceDate)), + Text(dateFormatter.format(_invoice!.invoiceDate!)), SizedBox( height: 10, ), @@ -371,8 +371,8 @@ class _InvoiceEditorState extends State { _addCustom(CustomDuty customDuty) { if (customDuty == null) return; setState(() { - _invoice.customDuties.remove(customDuty); - _invoice.customDuties.add(customDuty); + _invoice!.customDuties.remove(customDuty); + _invoice!.customDuties.add(customDuty); }); } @@ -380,8 +380,8 @@ class _InvoiceEditorState extends State { if (shipment == null) return; shipment.isSelected = true; setState(() { - _invoice.shipments.remove(shipment); - _invoice.shipments.add(shipment); + _invoice!.shipments!.remove(shipment); + _invoice!.shipments!.add(shipment); }); } @@ -389,30 +389,30 @@ class _InvoiceEditorState extends State { if (shipment == null) return; shipment.isSelected = false; setState(() { - _invoice.shipments.remove(shipment); - _invoice.shipments.add(shipment); + _invoice!.shipments!.remove(shipment); + _invoice!.shipments!.add(shipment); }); } _removeCustom(CustomDuty customDuty) { setState(() { - _invoice.customDuties.remove(customDuty); + _invoice!.customDuties.remove(customDuty); }); } _save() async { var rateModel = Provider.of(context, listen: false); - double amount = _invoice.getNetAmount(rateModel.rate); - if (_invoice.paymentMethod == null) { + double amount = _invoice!.getNetAmount(rateModel.rate); + if (_invoice!.paymentMethod == null) { showMsgDialog(context, "Error", "Payment method required"); return; } - List cargoTypes = _invoice.getCargoTypes(rateModel.rate); + List cargoTypes = _invoice!.getCargoTypes(rateModel.rate); if (cargoTypes == null || cargoTypes.length == 0) { showMsgDialog(context, "Error", "Expected at least one cargo type"); return; } - if ((amount ?? 0) <= 0) { + if ((amount ) <= 0) { showMsgDialog(context, "Error", "Expected positive amount"); return; } @@ -428,18 +428,18 @@ class _InvoiceEditorState extends State { Invoice invoice = Invoice(); invoice.cargoTypes = cargoTypes; invoice.amount = amount; - invoice.handlingFee = _invoice.getHandlingFee(); - invoice.cartons = _invoice.cartons.where((c) => c.isChecked).toList(); + invoice.handlingFee = _invoice!.getHandlingFee(); + invoice.cartons = _invoice!.cartons.where((c) => c.isChecked!).toList(); invoice.shipments = - _invoice.shipments.where((s) => s.isSelected).toList(); - invoice.discount = _invoice.discount; - invoice.deliveryFee = _invoice.deliveryFee; + _invoice!.shipments!.where((s) => s!.isSelected).toList(); + invoice.discount = _invoice!.discount; + invoice.deliveryFee = _invoice!.deliveryFee; - invoice.userID = widget.customer.id; - invoice.fcsShipmentID = widget.fcsShipment.id; - invoice.invoiceDate = _invoice.invoiceDate; - invoice.paymentMethod = _invoice.paymentMethod; - invoice.customDuties = _invoice.customDuties; + invoice.userID = widget.customer!.id; + invoice.fcsShipmentID = widget.fcsShipment!.id; + invoice.invoiceDate = _invoice!.invoiceDate; + invoice.paymentMethod = _invoice!.paymentMethod; + invoice.customDuties = _invoice!.customDuties; await invoiceModel.createInvoice(invoice); Navigator.pop(context, true); diff --git a/lib/pages/invoice/editor/invoice_handling_fee_list.dart b/lib/pages/invoice/editor/invoice_handling_fee_list.dart index 9e1af8b..75d6462 100644 --- a/lib/pages/invoice/editor/invoice_handling_fee_list.dart +++ b/lib/pages/invoice/editor/invoice_handling_fee_list.dart @@ -9,12 +9,12 @@ typedef OnAdd(Shipment shipment); typedef OnRemove(Shipment shipment); class InvoiceHandlingFeeList extends StatelessWidget { - final List shipments; - final OnAdd onAdd; - final OnRemove onRemove; + final List? shipments; + final OnAdd? onAdd; + final OnRemove? onRemove; const InvoiceHandlingFeeList( - {Key key, this.shipments, this.onAdd, this.onRemove}) + {Key? key, this.shipments, this.onAdd, this.onRemove}) : super(key: key); @override @@ -67,20 +67,19 @@ class InvoiceHandlingFeeList extends StatelessWidget { if (shipments == null) { return []; } - var rows = shipments.map((c) { + var rows = shipments!.map((c) { return MyDataRow( onSelectChanged: (value) => Navigator.pop(context, c), cells: [ MyDataCell(new Text( - c.shipmentNumber ?? "", + c!.shipmentNumber!, style: textStyle, )), MyDataCell( Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Text(c.handlingFee?.toStringAsFixed(2) ?? "0", - style: textStyle), + Text(c.handlingFee.toStringAsFixed(2), style: textStyle), onRemove == null ? SizedBox( width: 50, @@ -91,7 +90,7 @@ class InvoiceHandlingFeeList extends StatelessWidget { color: primaryColor, ), onPressed: () { - if (onRemove != null) onRemove(c); + if (onRemove != null) onRemove!(c); }) ], ), diff --git a/lib/pages/invoice/invoice_customer_list.dart b/lib/pages/invoice/invoice_customer_list.dart index dfa7a61..3df5226 100644 --- a/lib/pages/invoice/invoice_customer_list.dart +++ b/lib/pages/invoice/invoice_customer_list.dart @@ -11,9 +11,9 @@ import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class InvoiceCustomerList extends StatefulWidget { - final FcsShipment fcsShipment; + final FcsShipment? fcsShipment; - const InvoiceCustomerList({Key key, this.fcsShipment}) : super(key: key); + const InvoiceCustomerList({Key? key, this.fcsShipment}) : super(key: key); @override _InvoiceCustomerListState createState() => _InvoiceCustomerListState(); @@ -33,7 +33,7 @@ class _InvoiceCustomerListState extends State { _load() async { CustomerModel customerModel = Provider.of(context, listen: false); - var users = await customerModel.getInvoiceUsers(widget.fcsShipment.id); + var users = await customerModel.getInvoiceUsers(widget.fcsShipment!.id!); setState(() { _users = users; }); @@ -88,7 +88,7 @@ class _InvoiceCustomerListState extends State { customer: customer, fcsShipment: widget.fcsShipment, ))); - if (created ?? false) { + if (created) { _load(); } }, @@ -125,7 +125,7 @@ class _InvoiceCustomerListState extends State { Padding( padding: const EdgeInsets.only(top: 2.0), child: new Text( - customer.name, + customer.name!, style: new TextStyle( fontSize: 20.0, color: primaryColor), ), @@ -133,7 +133,7 @@ class _InvoiceCustomerListState extends State { Padding( padding: const EdgeInsets.only(top: 2.0), child: new Text( - customer.phoneNumber, + customer.phoneNumber!, style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/invoice/invoice_info.dart b/lib/pages/invoice/invoice_info.dart index 8681798..d9980ec 100644 --- a/lib/pages/invoice/invoice_info.dart +++ b/lib/pages/invoice/invoice_info.dart @@ -20,8 +20,8 @@ import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class InvoiceInfo extends StatefulWidget { - final Invoice invoice; - final bool forCustomer; + final Invoice? invoice; + final bool? forCustomer; InvoiceInfo({this.invoice, this.forCustomer}); @override @@ -31,16 +31,16 @@ class InvoiceInfo extends StatefulWidget { class _InvoiceInfoState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); - Invoice _invoice; + Invoice? _invoice; bool _isLoading = false; bool _showCartons = false; @override void initState() { super.initState(); - _invoice = widget.invoice; - _invoice.shipments?.forEach((s) { - s.isSelected = true; + _invoice = widget.invoice!; + _invoice!.shipments!.forEach((s) { + s!.isSelected = true; }); _loadCartons(); } @@ -54,7 +54,7 @@ class _InvoiceInfoState extends State { cartons.add(_carton); } setState(() { - _invoice.cartons = cartons; + _invoice!.cartons = cartons; }); } @@ -65,31 +65,31 @@ class _InvoiceInfoState extends State { @override Widget build(BuildContext context) { - bool isCanceled = _invoice.status == invoice_cancel_status; - bool isPaid = _invoice.status == invoice_paid_status; + bool isCanceled = _invoice!.status == invoice_cancel_status; + bool isPaid = _invoice!.status == invoice_paid_status; var rateModel = Provider.of(context); var rate = rateModel.rate; final cartonTable = InvoiceCartonTable( - cartons: _invoice.cartons, + cartons: _invoice!.cartons, rate: rate, ); final invoiceTableBox = InvoiceTable( - invoice: _invoice, + invoice: _invoice!, rate: rate, deliveryFeeSelected: (selected) { setState(() { if (selected) { - _invoice.deliveryFee = rate.deliveryFee; + _invoice!.deliveryFee = rate.deliveryFee; } else { - _invoice.deliveryFee = 0; + _invoice!.deliveryFee = 0; } }); }, discountSelected: (discount) { setState(() { - _invoice.discount = discount; + _invoice!.discount = discount; }); }, ); @@ -118,7 +118,7 @@ class _InvoiceInfoState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(dateFormatter.format(_invoice.invoiceDate)), + Text(dateFormatter.format(_invoice!.invoiceDate!)), SizedBox( height: 5, ), @@ -140,7 +140,7 @@ class _InvoiceInfoState extends State { ); final paymentMethodBox = DisplayText( labelTextKey: "invoice.payment_method", - text: _invoice.paymentMethod.name, + text: _invoice!.paymentMethod!.name, ); final cancelBtn = LocalButton( @@ -166,7 +166,7 @@ class _InvoiceInfoState extends State { padding: const EdgeInsets.all(8.0), child: ListView( children: [ - getInvoiceStatus(context, _invoice), + getInvoiceStatus(context, _invoice!), headerBox, _showCartons ? cartonTable : Container(), _showCartons @@ -183,7 +183,7 @@ class _InvoiceInfoState extends State { SizedBox( height: 10, ), - isCanceled || isPaid || widget.forCustomer + isCanceled || isPaid || widget.forCustomer! ? Container() : cancelBtn, ], @@ -206,7 +206,7 @@ class _InvoiceInfoState extends State { InvoiceModel invoiceModel = Provider.of(context, listen: false); - await invoiceModel.cancelInvoice(_invoice); + await invoiceModel.cancelInvoice(_invoice!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/invoice/invoice_list.dart b/lib/pages/invoice/invoice_list.dart index 6222180..cbb5ce3 100644 --- a/lib/pages/invoice/invoice_list.dart +++ b/lib/pages/invoice/invoice_list.dart @@ -12,9 +12,9 @@ import 'package:provider/provider.dart'; import 'invoice_list_row.dart'; class InvoiceList extends StatefulWidget { - final bool forCustomer; + final bool? forCustomer; - const InvoiceList({Key key, this.forCustomer}) : super(key: key); + const InvoiceList({Key? key, this.forCustomer}) : super(key: key); @override _InvoiceListState createState() => _InvoiceListState(); } @@ -29,13 +29,13 @@ class _InvoiceListState extends State { _controller.addListener(() async { if (_controller.position.pixels == _controller.position.maxScrollExtent) { Provider.of(context, listen: false) - .loadMore(isCustomer: widget.forCustomer); + .loadMore(isCustomer: widget.forCustomer!); } }); InvoiceModel invoiceModel = Provider.of(context, listen: false); - invoiceModel.initData(widget.forCustomer, true, false); + invoiceModel.initData(widget.forCustomer!, true, false); } @override @@ -66,13 +66,13 @@ class _InvoiceListState extends State { invoiceModel.selectedIndex = p.id; if (p.id == 2) { Provider.of(context, listen: false) - .initData(widget.forCustomer, false, true); + .initData(widget.forCustomer!, false, true); } else if (p.id == 3) { Provider.of(context, listen: false) - .initData(widget.forCustomer, true, false); + .initData(widget.forCustomer!, true, false); } else { Provider.of(context, listen: false) - .initData(widget.forCustomer, true, false); + .initData(widget.forCustomer!, true, false); } }), ); @@ -93,7 +93,7 @@ class _InvoiceListState extends State { color: Colors.white, fontSize: 20), actions: [popupMenu], ), - floatingActionButton: widget.forCustomer + floatingActionButton: widget.forCustomer! ? null : FloatingActionButton.extended( onPressed: () { diff --git a/lib/pages/invoice/invoice_list_row.dart b/lib/pages/invoice/invoice_list_row.dart index bc68360..2022362 100644 --- a/lib/pages/invoice/invoice_list_row.dart +++ b/lib/pages/invoice/invoice_list_row.dart @@ -12,9 +12,9 @@ import '../widgets/pdf_screen.dart'; class InvoiceListRow extends StatelessWidget { final dateFormatter = new DateFormat('dd MMM yyyy'); - final Invoice invoice; - final bool forCustomer; - InvoiceListRow({Key key, this.invoice, this.forCustomer}) : super(key: key); + final Invoice? invoice; + final bool? forCustomer; + InvoiceListRow({Key? key, this.invoice, this.forCustomer}) : super(key: key); @override Widget build(BuildContext context) { @@ -22,8 +22,8 @@ class InvoiceListRow extends StatelessWidget { onTap: () { Navigator.of(context).push(CupertinoPageRoute( builder: (context) => PDFScreen( - title: invoice.invoiceNumber, - url: invoice.invoiceURL, + title: invoice!.invoiceNumber, + url: invoice!.invoiceURL, ))); }, child: Row( @@ -48,17 +48,19 @@ class InvoiceListRow extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( - invoice.invoiceNumber ?? "", + invoice!.invoiceNumber ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.black), ), new Text( - invoice.status ?? "", + invoice!.status ?? "", style: new TextStyle( fontSize: 13.0, color: primaryColor), ), new Text( - dateFormatter.format(invoice.invoiceDate), + invoice!.invoiceDate != null + ? dateFormatter.format(invoice!.invoiceDate!) + : '', style: new TextStyle( fontSize: 15.0, color: Colors.grey), ) @@ -70,7 +72,7 @@ class InvoiceListRow extends StatelessWidget { ), ), ), - invoice.status == invoice_issued_status + invoice!.status == invoice_issued_status ? Padding( padding: const EdgeInsets.only(left: 10.0), child: InkWell( diff --git a/lib/pages/invoice/invoice_shipment_list_row.dart b/lib/pages/invoice/invoice_shipment_list_row.dart index eb66ce6..a08a362 100644 --- a/lib/pages/invoice/invoice_shipment_list_row.dart +++ b/lib/pages/invoice/invoice_shipment_list_row.dart @@ -2,7 +2,7 @@ import 'package:fcs/domain/entities/fcs_shipment.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import '../main/util.dart'; @@ -11,8 +11,8 @@ import 'invoice_customer_list.dart'; typedef OnSelect(FcsShipment fcsShipment); class InvoiceShipmentListRow extends StatefulWidget { - final OnSelect onSelect; - final FcsShipment fcsShipment; + final OnSelect? onSelect; + final FcsShipment? fcsShipment; const InvoiceShipmentListRow({this.fcsShipment, this.onSelect}); @override @@ -28,7 +28,7 @@ class _InvoiceShipmentListRowState extends State { void initState() { super.initState(); if (widget.fcsShipment != null) { - _fcsShipment = widget.fcsShipment; + _fcsShipment = widget.fcsShipment!; } } @@ -38,7 +38,7 @@ class _InvoiceShipmentListRowState extends State { padding: EdgeInsets.only(left: 15, right: 15), child: InkWell( onTap: () { - if (widget.onSelect != null) widget.onSelect(widget.fcsShipment); + if (widget.onSelect != null) widget.onSelect!(widget.fcsShipment!); }, child: Row( children: [ @@ -64,7 +64,7 @@ class _InvoiceShipmentListRowState extends State { child: new Text( _fcsShipment.shipmentNumber == null ? '' - : _fcsShipment.shipmentNumber, + : _fcsShipment.shipmentNumber!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -72,7 +72,7 @@ class _InvoiceShipmentListRowState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, top: 10), child: new Text( - dateFormatter.format(_fcsShipment.cutoffDate), + dateFormatter.format(_fcsShipment.cutoffDate!), style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), @@ -86,7 +86,7 @@ class _InvoiceShipmentListRowState extends State { ), Padding( padding: const EdgeInsets.all(0), - child: getStatus(_fcsShipment.status), + child: getStatus(_fcsShipment.status??"") ), ], ), diff --git a/lib/pages/invoice/invoice_table.dart b/lib/pages/invoice/invoice_table.dart index b25c222..77812dd 100644 --- a/lib/pages/invoice/invoice_table.dart +++ b/lib/pages/invoice/invoice_table.dart @@ -23,11 +23,11 @@ enum InvoiceDataType { class InvoiceTableRow { final dynamic data; - final String id; - final InvoiceDataType invoiceDataType; - final String desc; - final String rate; - final String amount; + final String? id; + final InvoiceDataType? invoiceDataType; + final String? desc; + final String? rate; + final String? amount; InvoiceTableRow( {this.id, @@ -39,14 +39,14 @@ class InvoiceTableRow { } class InvoiceTable extends StatelessWidget { - final Invoice invoice; - final Rate rate; - final OnDiscountSelected discountSelected; - final OnDeliveryFeeSelected deliveryFeeSelected; - final OnRemove onRemove; + final Invoice? invoice; + final Rate? rate; + final OnDiscountSelected? discountSelected; + final OnDeliveryFeeSelected? deliveryFeeSelected; + final OnRemove? onRemove; const InvoiceTable( - {Key key, + {Key? key, this.invoice, this.discountSelected, this.deliveryFeeSelected, @@ -61,7 +61,7 @@ class InvoiceTable extends StatelessWidget { List getTableRows() { List tableRows = []; // add cargo types - List _cargoTypes = invoice.getCargoTypes(rate) ?? []; + List _cargoTypes = invoice!.getCargoTypes(rate!); _cargoTypes.forEach((c) { tableRows.add(InvoiceTableRow( invoiceDataType: InvoiceDataType.CargoDataType, @@ -70,16 +70,16 @@ class InvoiceTable extends StatelessWidget { "${c.calWeight.toStringAsFixed(2)} x ${c.calRate.toStringAsFixed(2)}", amount: "${c.calAmount.toStringAsFixed(2)}")); }); - invoice.shipments.where((ss) => (ss.isSelected ?? false)).forEach((s) { + invoice!.shipments!.where((ss) => (ss!.isSelected )).forEach((s) { tableRows.add(InvoiceTableRow( data: s, invoiceDataType: InvoiceDataType.HandlingFeeType, - desc: "Handling fee\n${s.shipmentNumber}", + desc: "Handling fee\n${s!.shipmentNumber}", rate: "", amount: "${s.handlingFee.toStringAsFixed(2)}")); }); // // add custom fee - invoice.customDuties.forEach((c) { + invoice!.customDuties.forEach((c) { tableRows.add(InvoiceTableRow( data: c, invoiceDataType: InvoiceDataType.CustomFeeDataType, @@ -89,22 +89,22 @@ class InvoiceTable extends StatelessWidget { }); // // add delivery fee tableRows.add(InvoiceTableRow( - data: invoice.deliveryFee == null || invoice.deliveryFee == 0 + data: invoice!.deliveryFee == null || invoice!.deliveryFee == 0 ? null - : invoice.deliveryFee, + : invoice!.deliveryFee, invoiceDataType: InvoiceDataType.DeliveryFeeType, desc: "Delivery fee", rate: "", - amount: "${invoice?.deliveryFee?.toStringAsFixed(2) ?? '0'}")); + amount: "${invoice?.deliveryFee.toStringAsFixed(2) ?? '0'}")); // // add discounts - if (invoice.discount != null) { + if (invoice!.discount != null) { tableRows.add(InvoiceTableRow( - data: invoice.discount, + data: invoice!.discount, invoiceDataType: InvoiceDataType.DiscountDataType, desc: "Discount\n${invoice?.discount?.code ?? ""}", rate: "", - amount: "(${invoice?.discount?.amount?.toStringAsFixed(2) ?? ''})")); + amount: "(${invoice?.discount?.amount.toStringAsFixed(2) ?? ''})")); } return tableRows; @@ -132,7 +132,7 @@ class InvoiceTable extends StatelessWidget { r.data == null || onRemove == null ? Container() : InkWell( - onTap: () => onRemove(r), + onTap: () => onRemove!(r), child: Icon( Icons.remove_circle, color: Colors.black45, @@ -217,7 +217,7 @@ class InvoiceTable extends StatelessWidget { ), SizedBox(width: 20), Text( - '\$ ${invoice.getNetAmount(rate).toStringAsFixed(2)}', + '\$ ${invoice!.getNetAmount(rate!).toStringAsFixed(2)}', style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), textAlign: TextAlign.end, ) diff --git a/lib/pages/invoice/model/invoice_model.dart b/lib/pages/invoice/model/invoice_model.dart index f8f7758..e1d82ab 100644 --- a/lib/pages/invoice/model/invoice_model.dart +++ b/lib/pages/invoice/model/invoice_model.dart @@ -15,14 +15,14 @@ import 'package:path/path.dart' as Path; class InvoiceModel extends BaseModel { final log = Logger('InvoiceModel'); - StreamSubscription listener; + StreamSubscription>>? listener; List _invoices = []; List get invoices => _selectedIndex == 1 ? _invoices : List.from(_paginator.values); - Paginator _paginator; + late Paginator _paginator; bool endOfPaidInvoices = false; bool isLoading = false; @@ -33,7 +33,7 @@ class InvoiceModel extends BaseModel { notifyListeners(); } - get selectedIndex => _selectedIndex; + int get selectedIndex => _selectedIndex; @override void privilegeChanged() { @@ -52,26 +52,26 @@ class InvoiceModel extends BaseModel { Future _loadInvoices(bool forCustomer) async { if (user == null) return; - if (!forCustomer && !user.hasInvoices()) return; + if (!forCustomer && !user!.hasInvoices()) return; String path = "/$invoices_collection"; - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); _invoices = []; try { - var q = Firestore.instance + var q = FirebaseFirestore.instance .collection("$path") .where("status", isEqualTo: invoice_issued_status) .where("is_deleted", isEqualTo: false); if (forCustomer) { - q = q.where("user_id", isEqualTo: user.id); + q = q.where("user_id", isEqualTo: user!.id); } listener = q.snapshots().listen((QuerySnapshot snapshot) { _invoices.clear(); - _invoices = snapshot.documents.map((documentSnapshot) { - var s = Invoice.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + _invoices = snapshot.docs.map((documentSnapshot) { + var s = Invoice.fromMap(documentSnapshot.data as Map, + documentSnapshot.id); return s; }).toList(); notifyListeners(); @@ -83,13 +83,13 @@ class InvoiceModel extends BaseModel { Paginator _getPaginator(bool isCustomer, bool isCanceled, bool isPaid) { if (!isCustomer) { - if (user == null || !(user.hasInvoices())) throw "No privilege"; + if (user == null || !(user!.hasInvoices())) throw "No privilege"; } - var pageQuery = Firestore.instance + var pageQuery = FirebaseFirestore.instance .collection("/$invoices_collection") .where("is_deleted", isEqualTo: false); if (isCustomer) { - pageQuery = pageQuery.where("user_id", isEqualTo: user.id); + pageQuery = pageQuery.where("user_id", isEqualTo: user!.id); } if (isCanceled) { pageQuery = pageQuery.where("status", isEqualTo: invoice_cancel_status); @@ -105,7 +105,7 @@ class InvoiceModel extends BaseModel { return paginator; } - Future loadMore({bool isCustomer}) async { + Future loadMore({bool? isCustomer}) async { if (_paginator.ended || _selectedIndex == 1) return; // when paid menu is not selected return isLoading = true; @@ -116,7 +116,7 @@ class InvoiceModel extends BaseModel { }); } - Future refresh({bool isCustomer}) async { + Future refresh({bool? isCustomer}) async { if (_selectedIndex == 1) return; // when paid menu is not selected return await _paginator.refresh(onFinished: () { notifyListeners(); @@ -129,17 +129,17 @@ class InvoiceModel extends BaseModel { logout() async { if (_paginator != null) _paginator.close(); - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); _invoices = []; } - Future getInvoice(String id) async { + Future getInvoice(String id) async { String path = "/$invoices_collection"; try { - var ref = Firestore.instance.collection("$path").document(id); - var snap = await ref.get(source: Source.server); + var ref = FirebaseFirestore.instance.collection("$path").doc(id); + var snap = await ref.get(const GetOptions(source: Source.server)); if (snap.exists) { - var s = Invoice.fromMap(snap.data, snap.documentID); + var s = Invoice.fromMap(snap.data as Map, snap.id); return s; } } catch (e) { @@ -149,7 +149,7 @@ class InvoiceModel extends BaseModel { } Future pay(Payment payment, File file) async { - String path = Path.join(receipt_labels_files_path, user.id); + String path = Path.join(receipt_labels_files_path, user!.id); String url = await uploadStorage(path, file); payment.paymentReceiptURL = url; return Services.instance.invoiceService.pay(payment); diff --git a/lib/pages/invoice/payment/payment_page.dart b/lib/pages/invoice/payment/payment_page.dart index 680bec1..c17e966 100644 --- a/lib/pages/invoice/payment/payment_page.dart +++ b/lib/pages/invoice/payment/payment_page.dart @@ -20,8 +20,8 @@ import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class PaymentPage extends StatefulWidget { - final Invoice invoice; - final bool forCustomer; + final Invoice? invoice; + final bool? forCustomer; PaymentPage({this.invoice, this.forCustomer}); @override @@ -35,24 +35,24 @@ class _PaymentPageState extends State { Invoice _invoice = new Invoice(); bool _isLoading = false; - bool isNew; - File _file; - bool _hasBalance; + bool isNew = false; + File? _file; + bool _hasBalance = false; @override void initState() { super.initState(); - _invoice = widget.invoice; - _hasBalance = widget.invoice.balance > 0; + _invoice = widget.invoice!; + _hasBalance = widget.invoice!.balance > 0; _loadInvoice(); } _loadInvoice() async { InvoiceModel invoiceModel = Provider.of(context, listen: false); - Invoice i = await invoiceModel.getInvoice(_invoice.id); + Invoice? i = await invoiceModel.getInvoice(_invoice.id!); setState(() { - _invoice = i; + _invoice = i!; }); } @@ -97,7 +97,7 @@ class _PaymentPageState extends State { onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("pm_.title")), + title: Text(AppTranslations.of(context)!.text("pm_.title")), ), body: ListView( padding: const EdgeInsets.all(10.0), @@ -129,76 +129,74 @@ class _PaymentPageState extends State { getCustomFeeRows(BuildContext context) { List dataRow = []; - dataRow = _invoice?.payments?.map((p) { - return Container( - decoration: BoxDecoration( - border: Border(bottom: BorderSide(color: Colors.grey))), - padding: const EdgeInsets.only( - left: 5.0, right: 5.0, top: 5.0, bottom: 5.0), - child: Row( - children: [ - Expanded( - flex: 1, + dataRow = _invoice.payments.map((p) { + return Container( + decoration: BoxDecoration( + border: Border(bottom: BorderSide(color: Colors.grey))), + padding: + const EdgeInsets.only(left: 5.0, right: 5.0, top: 5.0, bottom: 5.0), + child: Row( + children: [ + Expanded( + flex: 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Text( + '${p.paymentDate != null ? dateFormatter.format(p.paymentDate!) : ""}'), + ), + SizedBox( + height: 5, + ), + LocalImagePicker( + key: ValueKey(p.id), + enabled: false, + initialImgUrl: p.paymentReceiptURL!, + title: "Receipt", + color: primaryColor, + ) + ], + )), + Expanded( + flex: 1, + child: Center( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Text( - '${p.paymentDate != null ? dateFormatter.format(p.paymentDate) : ""}'), - ), - SizedBox( - height: 5, - ), - LocalImagePicker( - key: ValueKey(p.id), - enabled: false, - initialImgUrl: p.paymentReceiptURL, - title: "Receipt", - color: primaryColor, - ) - ], - )), - Expanded( + children: [Text('\$ ${p.amount}'), Text('${p.status}')], + ))), + widget.forCustomer! + ? Container() + : Expanded( flex: 1, - child: Center( - child: Column( - children: [Text('\$ ${p.amount}'), Text('${p.status}')], - ))), - widget.forCustomer - ? Container() - : Expanded( - flex: 1, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: p.status == payment_pending_status - ? [ - InkWell( - onTap: () => _confirm(p), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Icon( - Icons.check, - color: primaryColor, - ), - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: p.status == payment_pending_status + ? [ + InkWell( + onTap: () => _confirm(p), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + Icons.check, + color: primaryColor, ), - InkWell( - onTap: () => _cancel(p), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Icon(Icons.close, - color: primaryColor), - ), - ), - ] - : [], - )), - ], - ), - ); - })?.toList() ?? - []; + ), + ), + InkWell( + onTap: () => _cancel(p), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(Icons.close, color: primaryColor), + ), + ), + ] + : [], + )), + ], + ), + ); + }).toList(); dataRow.insert( 0, @@ -217,7 +215,7 @@ class _PaymentPageState extends State { child: Text('Amount', textAlign: TextAlign.center, style: TextStyle(color: Colors.grey))), - widget.forCustomer + widget.forCustomer! ? Container() : Expanded( flex: 1, @@ -250,11 +248,11 @@ class _PaymentPageState extends State { flex: 1, child: Center( child: Text( - '\$ ${widget.invoice.balance.toStringAsFixed(2)}', + '\$ ${widget.invoice!.balance.toStringAsFixed(2)}', textAlign: TextAlign.center, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 16.0)))), - widget.forCustomer + widget.forCustomer! ? Container() : Expanded( flex: 1, @@ -279,7 +277,7 @@ class _PaymentPageState extends State { } _updatePayment(Payment payment) async { - payment.invoiceID = widget.invoice.id; + payment.invoiceID = widget.invoice!.id; setState(() { _isLoading = true; }); @@ -314,7 +312,7 @@ class _PaymentPageState extends State { try { InvoiceModel invoiceModel = Provider.of(context, listen: false); - await invoiceModel.pay(payment, _file); + await invoiceModel.pay(payment, _file!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/invoice/payment/payment_page_edit.dart b/lib/pages/invoice/payment/payment_page_edit.dart index f751dc3..098a354 100644 --- a/lib/pages/invoice/payment/payment_page_edit.dart +++ b/lib/pages/invoice/payment/payment_page_edit.dart @@ -20,7 +20,7 @@ import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class PaymentPageEdit extends StatefulWidget { - final Receipt receipt; + final Receipt? receipt; PaymentPageEdit({this.receipt}); @override @@ -33,14 +33,14 @@ class _PaymentPageEditState extends State { Receipt _receipt = new Receipt(); bool _isLoading = false; - File _file; + File? _file; - bool isNew; + bool isNew = false; @override void initState() { if (widget.receipt != null) { - _receipt = widget.receipt; + _receipt = widget.receipt!; } super.initState(); } @@ -154,7 +154,7 @@ class _PaymentPageEditState extends State { onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("pm_.title")), + title: Text(AppTranslations.of(context)!.text("pm_.title")), ), body: Padding( padding: const EdgeInsets.all(8.0), @@ -185,11 +185,11 @@ class _PaymentPageEditState extends State { return initialImage(); } else { Widget _widget; - if (widget.receipt.fileUrl == null) { + if (widget.receipt!.fileUrl == null) { _widget = initialImage(); } else { _widget = InkWell( - child: Image.asset(widget.receipt.fileUrl, fit: BoxFit.cover), + child: Image.asset(widget.receipt!.fileUrl!, fit: BoxFit.cover), onTap: () {}, ); } @@ -209,13 +209,13 @@ class _PaymentPageEditState extends State { Widget enableUpload(BuildContext context) { return InkWell( - child: Image.file(_file, fit: BoxFit.cover), + child: Image.file(_file!, fit: BoxFit.cover), onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => - ShowImage(imageFile: _file, url: null, fileName: 'image'))); + ShowImage(imageFile: _file!, url: '', fileName: 'image'))); }, ); } diff --git a/lib/pages/main/home_page.dart b/lib/pages/main/home_page.dart index 48080c8..1e1b88d 100644 --- a/lib/pages/main/home_page.dart +++ b/lib/pages/main/home_page.dart @@ -36,7 +36,7 @@ import 'package:fcs/pages/widgets/right_left_page_rout.dart'; import 'package:fcs/pages/widgets/task_button.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:logging/logging.dart'; @@ -84,7 +84,7 @@ class _HomePageState extends State { } _loadStaffMode(bool isCustomer) async { - bool staffMode = await SharedPref.getStaffMode(); + bool? staffMode = await SharedPref.getStaffMode(); setState(() { if (isCustomer) { isFcs[0] = false; @@ -94,7 +94,7 @@ class _HomePageState extends State { }); } - String notiUserID, notiUserName; + late String notiUserID, notiUserName; _showNotiContent(Map message) { try { Map map = Map.from(message["data"]); @@ -117,12 +117,12 @@ class _HomePageState extends State { if (mainModel.isLogin()) { timer.cancel(); bool isCustomer = mainModel.isCustomer(); - String receiverID = isCustomer ? mainModel.user.id : notiUserID; - String receiverName = isCustomer ? mainModel.user.name : notiUserName; + String? receiverID = isCustomer ? mainModel.user?.id : notiUserID; + String? receiverName = isCustomer ? mainModel.user?.name : notiUserName; MessageModel messageModel = Provider.of(context, listen: false); messageModel.initQuery(receiverID); - User user = mainModel.user; + User user = mainModel.user!; if (!isCustomer) { CustomerModel customerModel = Provider.of(context, listen: false); @@ -133,15 +133,15 @@ class _HomePageState extends State { MaterialPageRoute( builder: (context) => MessageDetail( messageModel: messageModel, - receiverID: receiverID, - receiverName: receiverName, + receiverID: receiverID ?? "", + receiverName: receiverName ?? "", ))).then((value) { if (user.userUnseenCount > 0) { - messageModel.seenMessages(user.id, true); + messageModel.seenMessages(user.id ?? "", true); } }); if (user.userUnseenCount > 0) { - messageModel.seenMessages(user.id, true); + messageModel.seenMessages(user.id ?? "", true); } } } @@ -151,7 +151,7 @@ class _HomePageState extends State { new AndroidInitializationSettings('@mipmap/ic_launcher'); var initializationSettingsIOS = new IOSInitializationSettings(); var initializationSettings = new InitializationSettings( - initializationSettingsAndroid, initializationSettingsIOS); + android: initializationSettingsAndroid, iOS: initializationSettingsIOS); _flutterLocalNotificationsPlugin.initialize(initializationSettings); } @@ -179,13 +179,15 @@ class _HomePageState extends State { 'your channel id', 'your channel name', 'your channel description', playSound: true, enableVibration: true, - importance: Importance.Max, - priority: Priority.High); + importance: Importance.max, + priority: Priority.high); + // @formatter:on var platformChannelSpecificsIos = new IOSNotificationDetails(presentSound: true); var platformChannelSpecifics = new NotificationDetails( - platformChannelSpecificsAndroid, platformChannelSpecificsIos); + android: platformChannelSpecificsAndroid, + iOS: platformChannelSpecificsIos); new Future.delayed(Duration.zero, () { _flutterLocalNotificationsPlugin.show( @@ -204,7 +206,7 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { - User user = Provider.of(context).user; + User? user = Provider.of(context).user; if (user == null) { Future.microtask( @@ -280,18 +282,18 @@ class _HomePageState extends State { )) .then((value) { if (user.userUnseenCount > 0) { - messageModel.seenMessages(user.id, true); + messageModel.seenMessages(user.id ?? "", true); } }); if (user.userUnseenCount > 0) { - messageModel.seenMessages(user.id, true); + messageModel.seenMessages(user.id ?? "", true); } }); final notiBtn = badgeCounter(notiBtnOrg, user.userUnseenCount); final staffBtn = TaskButton( "staff.title", - icon: MaterialCommunityIcons.worker, + icon: MaterialCommunityIcons.account_tie, btnCallback: () => Navigator.of(context).push(CupertinoPageRoute( builder: (context) => StaffList(), )), @@ -350,7 +352,7 @@ class _HomePageState extends State { selectedColor: Colors.white, color: Colors.blue, children: [ - Icon(MaterialCommunityIcons.worker), + Icon(MaterialCommunityIcons.account_tie), ], onPressed: (i) => this.setState(() { isFcs[0] = !isFcs[0]; @@ -531,7 +533,7 @@ class _HomePageState extends State { String term = _searchCtl.text; if (term == null || term.trim() == "") return; var packageModel = Provider.of(context, listen: false); - Package package = await packageModel.lookupPackage(term); + Package? package = await packageModel.lookupPackage(term); if (package == null) { showMsgDialog(context, "Not found", "Tracking ID - '$term' not found!"); return; diff --git a/lib/pages/main/initial_language_selection.dart b/lib/pages/main/initial_language_selection.dart index 7d6a018..7ce4cfe 100644 --- a/lib/pages/main/initial_language_selection.dart +++ b/lib/pages/main/initial_language_selection.dart @@ -3,7 +3,6 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/localization/transalation.dart'; import 'package:fcs/pages/main/model/language_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; -import 'package:fcs/pages/signin/signin_page.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/material.dart'; @@ -27,9 +26,9 @@ class _InitialLanguageSelectionPageState languagesList[1]: languageCodesList[1], }; - String selectedLanguage; - int selectedIndex; - bool _isLoading; + String selectedLanguage = 'en'; + late int selectedIndex; + bool _isLoading = false; @override void initState() { @@ -102,8 +101,8 @@ class _InitialLanguageSelectionPageState ? BoxDecoration() : BoxDecoration( border: Border( - bottom: - BorderSide(color: Colors.grey[300]), + bottom: BorderSide( + color: Colors.grey.shade300), ), ), child: ListTile( @@ -134,7 +133,7 @@ class _InitialLanguageSelectionPageState child: Radio( value: key, groupValue: selectedIndex, - onChanged: (int i) => + onChanged: (int? i) => _select(key, language), activeColor: primaryColor, ), diff --git a/lib/pages/main/model/base_model.dart b/lib/pages/main/model/base_model.dart index a0b82d0..a5cbc4f 100644 --- a/lib/pages/main/model/base_model.dart +++ b/lib/pages/main/model/base_model.dart @@ -6,9 +6,9 @@ import 'package:fcs/helpers/api_helper.dart'; import 'main_model.dart'; abstract class BaseModel extends ChangeNotifier { - User user; - Setting setting; - MainModel mainModel; + User? user; + Setting? setting; + MainModel? mainModel; void initUser(User user) async { this.user = user; @@ -16,7 +16,7 @@ abstract class BaseModel extends ChangeNotifier { void privilegeChanged() {} - void initSetting(Setting setting) async { + void initSetting(Setting? setting) async { this.setting = setting; } @@ -32,8 +32,8 @@ abstract class BaseModel extends ChangeNotifier { String path, method, { dynamic payload, - String token, - String url, + required String token, + String? url, }) async { return await requestAPI(path, method, payload: payload, token: token, url: url); diff --git a/lib/pages/main/model/language_model.dart b/lib/pages/main/model/language_model.dart index b6bd04c..5be6d4e 100644 --- a/lib/pages/main/model/language_model.dart +++ b/lib/pages/main/model/language_model.dart @@ -5,7 +5,7 @@ import 'package:flutter/painting.dart'; import 'base_model.dart'; class LanguageModel extends BaseModel { - String language; + late String language; bool get isEng => this.language == "English"; List get currentState => isEng ? [true, false] : [false, true]; diff --git a/lib/pages/main/model/main_model.dart b/lib/pages/main/model/main_model.dart index 5f2180e..67a963b 100644 --- a/lib/pages/main/model/main_model.dart +++ b/lib/pages/main/model/main_model.dart @@ -15,16 +15,16 @@ class MainModel extends ChangeNotifier { final log = Logger('MainModel'); List models = []; - String messagingToken; - User user; - PackageInfo packageInfo; + String? messagingToken; + User? user; + PackageInfo? packageInfo; set setMessaginToken(token) { this.messagingToken = token; uploadMsgToken(); } - Setting setting; + Setting? setting; bool isLoaded = false; bool isOnline = false; @@ -42,23 +42,23 @@ class MainModel extends ChangeNotifier { } bool faqEditable() { - return this.user != null && this.user.hasSupport(); + return this.user != null && this.user!.hasSupport(); } bool rateEditable() { - return this.user != null && this.user.hasSupport(); + return this.user != null && this.user!.hasSupport(); } bool paymentMethodsEditable() { - return this.user != null && this.user.hasSupport(); + return this.user != null && this.user!.hasSupport(); } bool termEditable() { - return this.user != null && this.user.hasSupport(); + return this.user != null && this.user!.hasSupport(); } bool contactEditable() { - return this.user != null && this.user.hasSupport(); + return this.user != null && this.user!.hasSupport(); } bool isLogin() { @@ -66,32 +66,31 @@ class MainModel extends ChangeNotifier { } bool isCustomer() { - return user != null && user.isCustomer(); + return user != null && user!.isCustomer(); } bool isSysAdmin() { - return this.user != null && this.user.hasSysAdmin(); + return this.user != null && this.user!.hasSysAdmin(); } bool isAdmin() { - return this.user != null && this.user.hasAdmin(); + return this.user != null && this.user!.hasAdmin(); } // userListener should never be closed - StreamSubscription userListener; + StreamSubscription? userListener; _init() async { await _listenSetting(); - this.isFirstLaunch = await SharedPref.isFirstLaunch(); - this.isFirstLaunch = this.isFirstLaunch ?? true; + this.isFirstLaunch = await SharedPref.isFirstLaunch() ?? true; this.packageInfo = await PackageInfo.fromPlatform(); - if (userListener != null) userListener.cancel(); + if (userListener != null) userListener!.cancel(); userListener = Services.instance.authService.getUserStream().listen((_user) { if (_user != null) { models.forEach((m) => m.initUser(_user)); // call diffPrivileges if privilege changed or first time login - if (this.user == null || _user.diffPrivileges(this.user)) { + if (this.user == null || _user.diffPrivileges(this.user!)) { models.forEach((m) => m.privilegeChanged()); } if (this.user == null) { @@ -124,7 +123,7 @@ class MainModel extends ChangeNotifier { bool isSupport() { if (packageInfo == null || setting == null) return false; - return int.parse(packageInfo.buildNumber) >= setting.supportBuildNum; + return int.parse(packageInfo!.buildNumber) >= setting!.supportBuildNum; } Future sendSms(String phoneNumber) { @@ -137,14 +136,14 @@ class MainModel extends ChangeNotifier { return authResult; } - Future uploadMsgToken() { + Future? uploadMsgToken() { if (messagingToken == null || user == null) return null; - return Services.instance.userService.uploadMsgToken(messagingToken); + return Services.instance.userService.uploadMsgToken(messagingToken!); } - Future removeMsgToken() { + Future? removeMsgToken() { if (messagingToken == null || user == null) return null; - return Services.instance.userService.removeMsgToken(messagingToken); + return Services.instance.userService.removeMsgToken(messagingToken!); } Future signout() async { diff --git a/lib/pages/main/splash_page.dart b/lib/pages/main/splash_page.dart index eb5edfb..e719e5b 100644 --- a/lib/pages/main/splash_page.dart +++ b/lib/pages/main/splash_page.dart @@ -18,7 +18,7 @@ class _SplashScreenState extends State { bool _loaded = false; bool _isSupport = false; bool _isOnline = true; - Timer timer; + late Timer timer; startTime() async { var _duration = new Duration(milliseconds: 3000); diff --git a/lib/pages/main/util.dart b/lib/pages/main/util.dart index a6ccd3f..277bfe1 100644 --- a/lib/pages/main/util.dart +++ b/lib/pages/main/util.dart @@ -33,7 +33,7 @@ Future showMsgDialog(BuildContext context, String title, String msg) { Future showConfirmDialog( BuildContext context, String translationKey, ok(), - {List translationVariables}) async { + {List? translationVariables}) async { await showDialog( context: context, builder: (_) { @@ -42,7 +42,7 @@ Future showConfirmDialog( child: LocalText( context, translationKey, - translationVariables: translationVariables, + translationVariables: translationVariables!, color: primaryColor, ), ), @@ -54,7 +54,7 @@ Future showConfirmDialog( FlatButton( color: Colors.grey[300], child: Text( - AppTranslations.of(context).text('btn.cancel'), + AppTranslations.of(context)!.text('btn.cancel'), style: Provider.of(context).isEng ? TextStyle() : TextStyle(fontFamily: 'Myanmar3'), @@ -67,7 +67,7 @@ Future showConfirmDialog( ), FlatButton( color: primaryColor, - child: Text(AppTranslations.of(context).text('btn.ok'), + child: Text(AppTranslations.of(context)!.text('btn.ok'), style: Provider.of(context).isEng ? TextStyle( color: Colors.white, @@ -188,7 +188,7 @@ Widget getStatus(String status) { ], ) : Text( - status ?? "", + status, style: TextStyle( color: primaryColor, fontSize: 18, @@ -230,10 +230,10 @@ Widget phoneWidget(BuildContext context, String phone) { } Widget fcsInput(String label, IconData iconData, - {TextEditingController controller, - String value, + {required TextEditingController controller, + required String value, bool autoFocus = false, - TextInputType textInputType}) { + TextInputType? textInputType}) { return TextFormField( initialValue: value, controller: controller, @@ -257,7 +257,7 @@ Widget fcsInput(String label, IconData iconData, } Widget fcsInputReadOnly(String label, IconData iconData, - {TextEditingController controller, String value}) { + {required TextEditingController controller, required String value}) { return TextFormField( initialValue: value, controller: controller, @@ -279,7 +279,7 @@ Widget fcsInputReadOnly(String label, IconData iconData, } Widget fcsDropDown(String label, IconData iconData, - {TextEditingController controller}) { + {required TextEditingController controller}) { return Row( children: [ Padding( @@ -308,7 +308,7 @@ Widget _dropDown() { height: 2, color: primaryColor, ), - onChanged: (String newValue) {}, + onChanged: (String? newValue) {}, items: ['Ko Nge', 'Two', 'Free', 'Four'] .map>((String value) { return DropdownMenuItem( @@ -320,7 +320,7 @@ Widget _dropDown() { } Widget fcsButton(BuildContext context, String text, - {Function callack, IconData iconData}) { + {Function? callack, IconData? iconData}) { var languageModel = Provider.of(context); var style = languageModel.isEng @@ -344,7 +344,7 @@ Widget fcsButton(BuildContext context, String text, minWidth: 900.0, height: 100.0, child: FlatButton( - onPressed: callack, + onPressed: callack == null ? null : () => callack(), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -367,11 +367,11 @@ Widget fcsButton(BuildContext context, String text, } String getLocalString(BuildContext context, String key) { - return AppTranslations.of(context).text(key); + return AppTranslations.of(context)!.text(key); } void showToast(GlobalKey key, String text) { - final ScaffoldState scaffold = key.currentState; + final ScaffoldState scaffold = key.currentState as ScaffoldState; scaffold.showSnackBar( SnackBar( content: Text(text), diff --git a/lib/pages/main/welcome_page.dart b/lib/pages/main/welcome_page.dart index df39162..c7ca5e5 100644 --- a/lib/pages/main/welcome_page.dart +++ b/lib/pages/main/welcome_page.dart @@ -24,7 +24,7 @@ typedef BtnCallback(); class _WelcomePageState extends State { final log = Logger('_HomePageWelcomeState'); - String pin; + late String pin; List isSelected = [true, false]; @override diff --git a/lib/pages/market/market_editor.dart b/lib/pages/market/market_editor.dart index 9ab9717..9efdd9e 100644 --- a/lib/pages/market/market_editor.dart +++ b/lib/pages/market/market_editor.dart @@ -35,7 +35,7 @@ class _MarketEditorState extends State { children: [ Expanded( child: new Text( - p.name, + p.name ?? "", style: TextStyle( fontSize: 15.0, ), @@ -61,7 +61,8 @@ class _MarketEditorState extends State { appBar: AppBar( centerTitle: true, leading: new IconButton( - icon: new Icon(CupertinoIcons.back, color: primaryColor, size: 30), + icon: + new Icon(CupertinoIcons.back, color: primaryColor, size: 30), onPressed: () => Navigator.of(context).pop(), ), shadowColor: Colors.transparent, @@ -116,7 +117,7 @@ class _MarketEditorState extends State { }); MarketModel marketModel = Provider.of(context, listen: false); try { - await marketModel.deleteMarket(market.id); + await marketModel.deleteMarket(market.id!); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { @@ -150,37 +151,39 @@ class _MarketEditorState extends State { _showDialog(BuildContext context) async { await showDialog( context: context, - child: new AlertDialog( - contentPadding: const EdgeInsets.all(16.0), - content: new Row( - children: [ - new Expanded( - child: InputText( - labelTextKey: "market.edit.name", - controller: _marketNameCtl, - autoFocus: true, - ), - ) + builder: (BuildContext context) { + return new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row( + children: [ + new Expanded( + child: InputText( + labelTextKey: "market.edit.name", + controller: _marketNameCtl, + autoFocus: true, + ), + ) + ], + ), + actions: [ + new FlatButton( + child: LocalText(context, "btn.cancel", color: primaryColor), + onPressed: () { + Navigator.pop(context); + }), + new FlatButton( + child: LocalText( + context, + "btn.save", + color: primaryColor, + ), + onPressed: () { + Navigator.pop(context); + _add(); + }) ], - ), - actions: [ - new FlatButton( - child: LocalText(context, "btn.cancel", color: primaryColor), - onPressed: () { - Navigator.pop(context); - }), - new FlatButton( - child: LocalText( - context, - "btn.save", - color: primaryColor, - ), - onPressed: () { - Navigator.pop(context); - _add(); - }) - ], - ), + ); + }, ); } } diff --git a/lib/pages/market/model/market_model.dart b/lib/pages/market/model/market_model.dart index c97cbdb..658d2c0 100644 --- a/lib/pages/market/model/market_model.dart +++ b/lib/pages/market/model/market_model.dart @@ -9,7 +9,7 @@ import 'package:logging/logging.dart'; class MarketModel extends BaseModel { final log = Logger('MarketModel'); - StreamSubscription listener; + StreamSubscription? listener; List markets = []; MarketModel() { @@ -18,16 +18,16 @@ class MarketModel extends BaseModel { Future _loadMarkets() async { try { - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("/$config_collection/$setting_doc_id/$markets_collection") .snapshots() .listen((QuerySnapshot snapshot) { markets.clear(); - markets = snapshot.documents.map((documentSnapshot) { + markets = snapshot.docs.map((documentSnapshot) { var user = Market.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, documentSnapshot.id); return user; }).toList(); notifyListeners(); diff --git a/lib/pages/package/model/package_model.dart b/lib/pages/package/model/package_model.dart index f826ceb..380f9b7 100644 --- a/lib/pages/package/model/package_model.dart +++ b/lib/pages/package/model/package_model.dart @@ -16,9 +16,9 @@ import 'package:path/path.dart' as Path; class PackageModel extends BaseModel { final log = Logger('PackageModel'); - PaginatorListener packages; - PaginatorListener customerPackages; - PaginatorListener activePackages; + late PaginatorListener packages; + late PaginatorListener customerPackages; + late PaginatorListener activePackages; bool isLoading = false; int _menuSelectedIndex = 1; @@ -32,7 +32,7 @@ class PackageModel extends BaseModel { notifyListeners(); } - get menuSelectedIndex => _menuSelectedIndex; + int get menuSelectedIndex => _menuSelectedIndex; void privilegeChanged() { if (user != null) { @@ -70,15 +70,16 @@ class PackageModel extends BaseModel { Future _loadPackages(bool isDelivered) async { if (user == null) return; - if (!((user.hasPackages() || user.hasReceiving() || user.hasProcessing()))) - return; + if (!((user!.hasPackages() || + user!.hasReceiving() || + user!.hasProcessing()))) return; String path = "/$packages_collection"; try { - Query listenerQuery = Firestore.instance + Query listenerQuery = FirebaseFirestore.instance .collection(path) .where("is_delivered", isEqualTo: isDelivered); - Query pageQuery = Firestore.instance + Query pageQuery = FirebaseFirestore.instance .collection(path) .where("is_delivered", isEqualTo: isDelivered); @@ -94,14 +95,14 @@ class PackageModel extends BaseModel { String path = "/$packages_collection"; try { - Query listenerQuery = Firestore.instance + Query listenerQuery = FirebaseFirestore.instance .collection(path) .where("is_delivered", isEqualTo: isDelivered) - .where("user_id", isEqualTo: user.id); - Query pageQuery = Firestore.instance + .where("user_id", isEqualTo: user!.id); + Query pageQuery = FirebaseFirestore.instance .collection(path) .where("is_delivered", isEqualTo: isDelivered) - .where("user_id", isEqualTo: user.id) + .where("user_id", isEqualTo: user!.id) .orderBy("update_time", descending: true); customerPackages.refresh( @@ -113,15 +114,16 @@ class PackageModel extends BaseModel { Future _loadActivePackages() async { if (user == null) return; - if (!((user.hasPackages() || user.hasReceiving() || user.hasProcessing()))) - return; + if (!((user!.hasPackages() || + user!.hasReceiving() || + user!.hasProcessing()))) return; String path = "/$packages_collection"; try { - Query listenerQuery = Firestore.instance + Query listenerQuery = FirebaseFirestore.instance .collection(path) .where("is_delivered", isEqualTo: false); - Query pageQuery = Firestore.instance + Query pageQuery = FirebaseFirestore.instance .collection(path) .where("is_delivered", isEqualTo: false); @@ -133,14 +135,15 @@ class PackageModel extends BaseModel { } } - Future getPackage(String id) async { + Future getPackage(String id) async { if (user == null) return null; String path = "/$packages_collection"; try { DocumentSnapshot snap = - await Firestore.instance.collection("$path").document(id).get(); + await FirebaseFirestore.instance.collection("$path").doc(id).get(); if (snap.exists) { - var package = Package.fromMap(snap.data, snap.documentID); + var package = + Package.fromMap(snap.data as Map, snap.id); return package; } } catch (e) { @@ -149,18 +152,19 @@ class PackageModel extends BaseModel { return null; } - Future getPackageByTrackingID(String trackingID) async { + Future getPackageByTrackingID(String trackingID) async { if (user == null) return null; String path = "/$packages_collection"; try { - var snaps = await Firestore.instance + var snaps = await FirebaseFirestore.instance .collection("$path") .where("tracking_id", isEqualTo: trackingID) .where("is_deleted", isEqualTo: false) - .getDocuments(source: Source.server); - if (snaps.documents.length == 1) { - var snap = snaps.documents[0]; - var package = Package.fromMap(snap.data, snap.documentID); + .get(const GetOptions(source: Source.server)); + if (snaps.docs.length == 1) { + var snap = snaps.docs[0]; + var package = + Package.fromMap(snap.data as Map, snap.id); return package; } } catch (e) { @@ -169,35 +173,37 @@ class PackageModel extends BaseModel { return null; } - Future lookupPackage(String trackingID) async { + Future lookupPackage(String trackingID) async { if (user == null) return null; String path = "/$packages_collection"; try { - var qsnap = await Firestore.instance + var qsnap = await FirebaseFirestore.instance .collection("$path") .where("tracking_id", isEqualTo: trackingID) .where("has_user_id", isEqualTo: false) .where("is_deleted", isEqualTo: false) - .getDocuments(source: Source.server); - if (qsnap.documents.length > 0) { - var snap = qsnap.documents[0]; + .get(const GetOptions(source: Source.server)); + if (qsnap.docs.length > 0) { + var snap = qsnap.docs[0]; if (snap.exists) { - var package = Package.fromMap(snap.data, snap.documentID); + var package = + Package.fromMap(snap.data as Map, snap.id); return package; } } - qsnap = await Firestore.instance + qsnap = await FirebaseFirestore.instance .collection("$path") .where("tracking_id", isEqualTo: trackingID) - .where("user_id", isEqualTo: user.id) + .where("user_id", isEqualTo: user!.id) .where("is_deleted", isEqualTo: false) - .getDocuments(source: Source.server); - if (qsnap.documents.length > 0) { - var snap = qsnap.documents[0]; + .get(const GetOptions(source: Source.server)); + if (qsnap.docs.length > 0) { + var snap = qsnap.docs[0]; if (snap.exists) { - var package = Package.fromMap(snap.data, snap.documentID); + var package = + Package.fromMap(snap.data as Map, snap.id); return package; } } @@ -210,15 +216,15 @@ class PackageModel extends BaseModel { Future> getPackages(String userID, List status) async { List packages = []; try { - var snaps = await Firestore.instance + var snaps = await FirebaseFirestore.instance .collection("/$packages_collection") .where("status", whereIn: status) .where("user_id", isEqualTo: userID) .where("is_deleted", isEqualTo: false) - .getDocuments(source: Source.server); - packages = snaps.documents.map((documentSnapshot) { - var p = - Package.fromMap(documentSnapshot.data, documentSnapshot.documentID); + .get(const GetOptions(source: Source.server)); + packages = snaps.docs.map((documentSnapshot) { + var p = Package.fromMap( + documentSnapshot.data as Map, documentSnapshot.id); return p; }).toList(); } catch (e) { @@ -235,26 +241,26 @@ class PackageModel extends BaseModel { Future> packages = Services.instance.packageService.searchPackage(term); - Future> packagesFTS = + Future?> packagesFTS = Services.instance.packageService.ftsSearchPackage(term); // Package pkg = await getPackageByTrackingID(term); // if (pkg != null && !packages.contains(pkg)) { // packages.insert(0, pkg); // } List pkgs = await packages; - List ftsPkgs = await packagesFTS; - pkgs.addAll(ftsPkgs); + List? ftsPkgs = await packagesFTS; + pkgs.addAll(ftsPkgs!); final seen = Set(); return pkgs.where((e) => seen.add(e)).toList(); } Future createPackages(User user, List packages) { return Services.instance.packageService - .createPackages(packages, user.fcsID); + .createPackages(packages, user.fcsID!); } Future createReceiving( - User user, Package package, List files) async { + User user, Package package, List files) async { if (user != null) { package.fcsID = user.fcsID; } @@ -282,22 +288,21 @@ class PackageModel extends BaseModel { } } - Future updateReceiving(User user, Package package, List files, - List deletedUrls) async { + Future updateReceiving(User user, Package package, List files, + List deletedUrls) async { if (user != null) { package.fcsID = user.fcsID; } if (deletedUrls != null) { - for (String url in deletedUrls) { + for (String? url in deletedUrls) { package.photoUrls.remove(url); } } List uploadedURL = []; if (files != null) { - var count = (package.photoUrls?.length ?? 0) + - files.length - - (deletedUrls?.length ?? 0); + var count = + (package.photoUrls.length) + files.length - (deletedUrls.length); if (count > uploadPhotoLimit) throw Exception("Exceed number of file upload"); @@ -327,18 +332,17 @@ class PackageModel extends BaseModel { } Future updateProcessing( - Package package, List files, List deletedUrls) async { + Package package, List files, List deletedUrls) async { if (deletedUrls != null) { - for (String url in deletedUrls) { + for (String? url in deletedUrls) { package.photoUrls.remove(url); } } List uploadedURL = []; if (files != null) { - var count = (package.photoUrls?.length ?? 0) + - files.length - - (deletedUrls?.length ?? 0); + var count = + (package.photoUrls.length) + files.length - (deletedUrls.length); if (count > uploadPhotoLimit) throw Exception("Exceed number of file upload"); @@ -370,10 +374,10 @@ class PackageModel extends BaseModel { Future changeDeliveryAddress( Package package, DeliveryAddress deliveryAddress) { return Services.instance.packageService - .changeDeliveryAddress(package.id, deliveryAddress.id); + .changeDeliveryAddress(package.id!, deliveryAddress.id!); } Future packageReturn(Package package) { - return Services.instance.packageService.packageReturn(package.id); + return Services.instance.packageService.packageReturn(package.id!); } } diff --git a/lib/pages/package/package_editor.dart b/lib/pages/package/package_editor.dart index 0f488f3..9afa78b 100644 --- a/lib/pages/package/package_editor.dart +++ b/lib/pages/package/package_editor.dart @@ -14,12 +14,12 @@ import 'package:fcs/pages/widgets/multi_img_file.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class PackageEditorPage extends StatefulWidget { - final Package package; + final Package? package; PackageEditorPage({this.package}); @override @@ -30,17 +30,17 @@ class _PackageEditorPageState extends State { TextEditingController _remarkCtl = new TextEditingController(); TextEditingController _descCtl = new TextEditingController(); - Package _package; + Package? _package; bool _isLoading = false; @override void initState() { super.initState(); - _package = widget.package; - selectedMarket = _package.market ?? ""; - _descCtl.text = _package.desc; - _remarkCtl.text = _package.remark; - multiImgController.setImageUrls = _package.photoUrls; + _package = widget.package!; + selectedMarket = _package!.market; + _descCtl.text = _package!.desc!; + _remarkCtl.text = _package!.remark!; + multiImgController.setImageUrls = _package!.photoUrls; } final DateFormat dateFormat = DateFormat("d MMM yyyy"); @@ -51,17 +51,17 @@ class _PackageEditorPageState extends State { @override Widget build(BuildContext context) { final trackingIdBox = DisplayText( - text: _package.trackingID, + text: _package != null ? _package!.trackingID : "", labelTextKey: "package.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); final statusBox = DisplayText( - text: _package.status, + text: _package != null ? _package!.status : "", labelTextKey: "package.edit.status", iconData: AntDesign.exclamationcircleo, ); final customerNameBox = DisplayText( - text: _package.userName, + text: _package != null ? _package!.userName : "", labelTextKey: "package.create.name", iconData: Icons.perm_identity, ); @@ -154,13 +154,13 @@ class _PackageEditorPageState extends State { ); } - String selectedMarket; + String? selectedMarket; Widget marketDropdown() { List _markets = Provider.of(context).markets; - List markets = _markets.map((e) => e.name).toList(); + List markets = _markets.map((e) => e.name).toList(); markets.insert(0, MANAGE_MARKET); if (!markets.contains(selectedMarket)) { - markets.insert(0, selectedMarket); + markets.insert(0, selectedMarket!); } return Row( @@ -183,7 +183,7 @@ class _PackageEditorPageState extends State { height: 1, color: Colors.grey, ), - onChanged: (String newValue) { + onChanged: (String? newValue) { setState(() { if (newValue == MANAGE_MARKET) { selectedMarket = null; @@ -194,7 +194,7 @@ class _PackageEditorPageState extends State { }); }, isExpanded: true, - items: markets.map>((String value) { + items: markets.map>((String? value) { return DropdownMenuItem( value: value, child: Text(value ?? "", @@ -229,9 +229,9 @@ class _PackageEditorPageState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - _package.desc = _descCtl.text; - _package.remark = _remarkCtl.text; - _package.market = selectedMarket; + _package!.desc = _descCtl.text; + _package!.remark = _remarkCtl.text; + _package!.market = selectedMarket!; // await packageModel.completeProcessing(_package, // multiImgController.getAddedFile, multiImgController.getDeletedUrl); Navigator.pop(context); diff --git a/lib/pages/package/package_info.dart b/lib/pages/package/package_info.dart index 3e32a2d..cb755e6 100644 --- a/lib/pages/package/package_info.dart +++ b/lib/pages/package/package_info.dart @@ -18,7 +18,7 @@ import 'package:fcs/pages/widgets/progress.dart'; import 'package:fcs/pages/widgets/status_tree.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -27,7 +27,7 @@ final DateFormat dateFormat = DateFormat("d MMM yyyy"); class PackageInfo extends StatefulWidget { final isCustomer; final isSearchResult; - final Package package; + final Package? package; PackageInfo( {this.package, this.isSearchResult = false, this.isCustomer = false}); @@ -38,23 +38,23 @@ class PackageInfo extends StatefulWidget { class _PackageInfoState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); - Package _package; + Package? _package; bool _isLoading = false; MultiImgController multiImgController = MultiImgController(); @override void initState() { super.initState(); - initPackage(widget.package); + initPackage(widget.package!); } initPackage(Package pkg) async { PackageModel packageModel = Provider.of(context, listen: false); - Package package = await packageModel.getPackageByTrackingID(pkg.trackingID); + Package? package = await packageModel.getPackageByTrackingID(pkg.trackingID!); setState(() { _package = package; - multiImgController.setImageUrls = package.photoUrls; + multiImgController.setImageUrls = package!.photoUrls; }); } @@ -65,7 +65,7 @@ class _PackageInfoState extends State { @override Widget build(BuildContext context) { - String id = Provider.of(context).user.id; + String? id = Provider.of(context).user!.id; bool owner = _package?.userID == id; bool canChangeDeliveryAddress = _package?.status == package_received_status || @@ -113,21 +113,21 @@ class _PackageInfoState extends State { callBack: _return, ); final deliveryAddressBox = DefaultDeliveryAddress( - deliveryAddress: _package?.deliveryAddress, + deliveryAddress: _package!.deliveryAddress, labelKey: "package.delivery.address", onTap: owner && canChangeDeliveryAddress ? () async { - DeliveryAddress d = await Navigator.push( + DeliveryAddress? d = await Navigator.push( context, CupertinoPageRoute( builder: (context) => DeliveryAddressSelection( - deliveryAddress: _package.deliveryAddress, + deliveryAddress: _package!.deliveryAddress, user: mainModel.user)), ); if (d == null) return; _changeDeliverayAddress(d); } - : null, + : () {}, ); return LocalProgress( @@ -159,7 +159,7 @@ class _PackageInfoState extends State { widget.isSearchResult ? Container() : fcsIDBox, widget.isSearchResult ? Container() : customerNameBox, widget.isSearchResult ? Container() : marketBox, - _package == null || _package.photoUrls.length == 0 + _package == null || _package!.photoUrls.length == 0 ? Container() : img, widget.isSearchResult ? Container() : descBox, @@ -172,8 +172,8 @@ class _PackageInfoState extends State { widget.isSearchResult ? Container() : StatusTree( - shipmentHistory: _package?.shipmentHistory, - currentStatus: _package?.status), + shipmentHistory: _package!.shipmentHistory, + currentStatus: _package!.status), SizedBox( height: 20, ) @@ -197,11 +197,11 @@ class _PackageInfoState extends State { Provider.of(context, listen: false); try { - await packageModel.changeDeliveryAddress(_package, deliveryAddress); + await packageModel.changeDeliveryAddress(_package!, deliveryAddress); var da = - await deliveryAddressModel.getDeliveryAddress(deliveryAddress.id); + await deliveryAddressModel.getDeliveryAddress(deliveryAddress.id!); setState(() { - _package.deliveryAddress = da; + _package!.deliveryAddress = da; }); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -223,7 +223,7 @@ class _PackageInfoState extends State { try { PackageModel packageModel = Provider.of(context, listen: false); - await packageModel.packageReturn(_package); + await packageModel.packageReturn(_package!); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/package/package_list.dart b/lib/pages/package/package_list.dart index c28ce22..e806ead 100644 --- a/lib/pages/package/package_list.dart +++ b/lib/pages/package/package_list.dart @@ -16,7 +16,7 @@ import 'package:provider/provider.dart'; class PackageList extends StatefulWidget { final bool forCustomer; - const PackageList({Key key, this.forCustomer = true}) : super(key: key); + const PackageList({Key? key, this.forCustomer = true}) : super(key: key); @override _PackageListState createState() => _PackageListState(); } @@ -97,7 +97,7 @@ class _PackageListState extends State { _searchCallback(Package package) async { var packageModel = Provider.of(context, listen: false); - Package _package = await packageModel.getPackage(package.id); + Package? _package = await packageModel.getPackage(package.id!); if (_package == null) return; Navigator.push( context, diff --git a/lib/pages/package/package_list_row.dart b/lib/pages/package/package_list_row.dart index 76c8297..a613c26 100644 --- a/lib/pages/package/package_list_row.dart +++ b/lib/pages/package/package_list_row.dart @@ -4,28 +4,31 @@ import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/package/package_info.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; typedef CallbackPackageSelect(Package package); class PackageListRow extends StatelessWidget { final bool isCustomer; - final Package package; - final CallbackPackageSelect callbackPackageSelect; + final Package? package; + final CallbackPackageSelect? callbackPackageSelect; final double dotSize = 15.0; final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); PackageListRow( - {Key key, this.package, this.callbackPackageSelect, this.isCustomer}) + {Key? key, + this.package, + this.callbackPackageSelect, + this.isCustomer = false}) : super(key: key); @override Widget build(BuildContext context) { return InkWell( - onTap: () { + onTap: () { if (callbackPackageSelect != null) { - callbackPackageSelect(package); + callbackPackageSelect!(package!); return; } Navigator.push( @@ -57,7 +60,9 @@ class PackageListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.id == null ? '' : package.trackingID, + package!.id == null + ? '' + : package!.trackingID!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -65,7 +70,9 @@ class PackageListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.market == null ? '' : package.market, + package!.market == null + ? '' + : package!.market!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -81,12 +88,14 @@ class PackageListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(3.0), - child: getStatus(package.status), + child: getStatus(package!.status??""), ), Padding( padding: const EdgeInsets.all(0), child: new Text( - dateFormat.format(package.currentStatusDate), + package!.currentStatusDate != null + ? dateFormat.format(package!.currentStatusDate!) + : '', style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/package/package_new.dart b/lib/pages/package/package_new.dart index 54360eb..1b33c1d 100644 --- a/lib/pages/package/package_new.dart +++ b/lib/pages/package/package_new.dart @@ -26,7 +26,7 @@ class PackageNew extends StatefulWidget { class _PackageNewState extends State { bool _isLoading = false; - User user; + User? user; List packages = []; @@ -41,7 +41,7 @@ class _PackageNewState extends State { children: [ Expanded( child: DisplayText( - text: user != null ? user.fcsID : "", + text: user != null ? user!.fcsID : "", labelTextKey: "package.create.fcs.id", icon: FcsIDIcon(), )), @@ -55,12 +55,12 @@ class _PackageNewState extends State { ], ); final namebox = DisplayText( - text: user != null ? user.name : "", + text: user != null ? user!.name : "", labelTextKey: "package.create.name", iconData: Icons.person, ); final phoneNumberBox = DisplayText( - text: user != null ? user.phoneNumber : "", + text: user != null ? user!.phoneNumber : "", labelTextKey: "package.create.phone", iconData: Icons.phone, ); @@ -144,8 +144,8 @@ class _PackageNewState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(packages[index].market ?? ""), - Text(packages[index].trackingID), + Text(packages[index].market!), + Text(packages[index].trackingID!), // DisplayText( // labelText: "Tracking ID", // text: packages[index].trackingID, @@ -170,7 +170,7 @@ class _PackageNewState extends State { } _addPackage() async { - Package package = await Navigator.push( + Package? package = await Navigator.push( context, CupertinoPageRoute(builder: (context) => TrackingIDPage()), ); @@ -197,7 +197,7 @@ class _PackageNewState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - await packageModel.createPackages(user, packages); + await packageModel.createPackages(user!, packages); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/package/tracking_id_page.dart b/lib/pages/package/tracking_id_page.dart index 26db8ae..6cdd773 100644 --- a/lib/pages/package/tracking_id_page.dart +++ b/lib/pages/package/tracking_id_page.dart @@ -1,4 +1,3 @@ -import 'package:barcode_scan/barcode_scan.dart'; import 'package:fcs/domain/entities/market.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/helpers/theme.dart'; @@ -12,7 +11,7 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; @@ -20,7 +19,7 @@ const MANAGE_MARKET = "Manage Market"; const SELECT_MARKET = "Select Market"; class TrackingIDPage extends StatefulWidget { - const TrackingIDPage({Key key}) : super(key: key); + const TrackingIDPage({Key? key}) : super(key: key); @override _TrackingIDPageState createState() => _TrackingIDPageState(); } @@ -85,10 +84,10 @@ class _TrackingIDPageState extends State { ); } - String selectedMarket; + String? selectedMarket; Widget dropDown() { List _markets = Provider.of(context).markets; - List markets = _markets.map((e) => e.name).toList(); + List markets = _markets.map((e) => e.name).toList(); markets.insert(0, MANAGE_MARKET); markets.insert(0, SELECT_MARKET); @@ -112,7 +111,7 @@ class _TrackingIDPageState extends State { height: 1, color: Colors.grey, ), - onChanged: (String newValue) { + onChanged: (String? newValue) { setState(() { if (newValue == MANAGE_MARKET) { selectedMarket = null; @@ -127,10 +126,10 @@ class _TrackingIDPageState extends State { }); }, isExpanded: true, - items: markets.map>((String value) { + items: markets.map>((String? value) { return DropdownMenuItem( value: value, - child: Text(value, + child: Text(value ?? "", overflow: TextOverflow.ellipsis, style: TextStyle( color: value == MANAGE_MARKET @@ -147,25 +146,25 @@ class _TrackingIDPageState extends State { _manageMarket() { Navigator.push( context, - CupertinoPageRoute(builder: (context) => MarketEditor()), + CupertinoPageRoute(builder: (context) => MarketEditor()), ); } _scan() async { - PermissionStatus permission = - await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); - if (permission != PermissionStatus.granted) { - Map permissions = - await PermissionHandler() - .requestPermissions([PermissionGroup.camera]); - if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { - showMsgDialog(context, "Error", "Camera permission is not granted"); - return null; - } - } + // PermissionStatus permission = + // await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); + // if (permission != PermissionStatus.granted) { + // Map permissions = + // await PermissionHandler() + // .requestPermissions([PermissionGroup.camera]); + // if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { + // showMsgDialog(context, "Error", "Camera permission is not granted"); + // return null; + // } + // } try { - String barcode = await scanBarcode(); + String? barcode = await scanBarcode(); if (barcode != null) { setState(() { _transcationIDCtl.text = barcode; @@ -179,6 +178,6 @@ class _TrackingIDPageState extends State { _select() { if (_transcationIDCtl.text == "" && selectedMarket == null) return; Navigator.pop(context, - Package(trackingID: _transcationIDCtl.text, market: selectedMarket)); + Package(trackingID: _transcationIDCtl.text, market: selectedMarket!)); } } diff --git a/lib/pages/package_search/package_serach.dart b/lib/pages/package_search/package_serach.dart index 2ee5ccf..566b46c 100644 --- a/lib/pages/package_search/package_serach.dart +++ b/lib/pages/package_search/package_serach.dart @@ -1,4 +1,3 @@ -import 'package:barcode_scan/barcode_scan.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; @@ -6,12 +5,12 @@ import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/package/package_list_row.dart'; import 'package:fcs/pages/widgets/barcode_scanner.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; -Future searchPackage(BuildContext context, - {CallbackPackageSelect callbackPackageSelect}) async => +Future searchPackage(BuildContext context, + {CallbackPackageSelect? callbackPackageSelect}) async => await showSearch( context: context, delegate: @@ -19,7 +18,7 @@ Future searchPackage(BuildContext context, ); class PackageSearchDelegate extends SearchDelegate { - final CallbackPackageSelect callbackPackageSelect; + final CallbackPackageSelect? callbackPackageSelect; PackageSearchDelegate({this.callbackPackageSelect}); @@ -32,10 +31,10 @@ class PackageSearchDelegate extends SearchDelegate { return theme.copyWith( inputDecorationTheme: InputDecorationTheme( hintStyle: TextStyle( - color: theme.primaryTextTheme.caption.color, fontSize: 14)), + color: theme.primaryTextTheme.caption!.color, fontSize: 14)), textTheme: theme.textTheme.copyWith( - title: theme.textTheme.title.copyWith( - color: theme.primaryTextTheme.title.color, fontSize: 16)), + title: theme.textTheme.title!.copyWith( + color: theme.primaryTextTheme.title!.color, fontSize: 16)), primaryColor: primaryColor, ); } @@ -59,7 +58,7 @@ class PackageSearchDelegate extends SearchDelegate { Widget buildLeading(BuildContext context) { return IconButton( icon: Icon(Icons.arrow_back), - onPressed: () => close(context, null), + onPressed: () => close(context, new Package()), ); } @@ -70,7 +69,7 @@ class PackageSearchDelegate extends SearchDelegate { future: packageModel.searchPackage(query), builder: (context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { - if (snapshot.data.length == 0) { + if (snapshot.data!.length == 0) { return Container( child: Center( child: Text( @@ -83,7 +82,7 @@ class PackageSearchDelegate extends SearchDelegate { return Container( padding: EdgeInsets.only(top: 15), child: ListView( - children: snapshot.data + children: snapshot.data! .map((u) => PackageListRow( package: u, callbackPackageSelect: callbackPackageSelect, @@ -124,17 +123,17 @@ class PackageSearchDelegate extends SearchDelegate { } _scan(BuildContext context) async { - PermissionStatus permission = - await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); - if (permission != PermissionStatus.granted) { - Map permissions = - await PermissionHandler() - .requestPermissions([PermissionGroup.camera]); - if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { - showMsgDialog(context, "Error", "Camera permission is not granted"); - return null; - } - } + // PermissionStatus permission = + // await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); + // if (permission != PermissionStatus.granted) { + // Map permissions = + // await PermissionHandler() + // .requestPermissions([PermissionGroup.camera]); + // if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { + // showMsgDialog(context, "Error", "Camera permission is not granted"); + // return null; + // } + // } try { // PickedFile pickedFile = @@ -148,7 +147,7 @@ class PackageSearchDelegate extends SearchDelegate { // Barcode bc = barcodes.firstWhere((element) => true); // String barcode; // if (bc != null) barcode = bc.rawValue; - String barcode = await scanBarcode(); + String? barcode = await scanBarcode(); if (barcode != null) { query = barcode; showResults(context); diff --git a/lib/pages/payment_methods/model/payment_method_model.dart b/lib/pages/payment_methods/model/payment_method_model.dart index 25d9f11..229bd9f 100644 --- a/lib/pages/payment_methods/model/payment_method_model.dart +++ b/lib/pages/payment_methods/model/payment_method_model.dart @@ -12,21 +12,22 @@ class PaymentMethodModel extends BaseModel { List paymentMethods = []; PaymentMethod getPaymentMethod(String id) { - return paymentMethods.firstWhere((e) => e.id == id, orElse: () => null); + return paymentMethods.firstWhere((e) => e.id == id); } - StreamSubscription listener; + StreamSubscription? listener; PaymentMethodModel() { - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); try { - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("/payment_methods") .snapshots() .listen((snaps) { paymentMethods.clear(); - snaps.documents.forEach((d) { - paymentMethods.add(PaymentMethod.fromMap(d.data, d.documentID)); + snaps.docs.forEach((d) { + paymentMethods + .add(PaymentMethod.fromMap(d.data as Map, d.id)); }); notifyListeners(); }); diff --git a/lib/pages/payment_methods/payment_method_editor.dart b/lib/pages/payment_methods/payment_method_editor.dart index 9118cdf..9699db7 100644 --- a/lib/pages/payment_methods/payment_method_editor.dart +++ b/lib/pages/payment_methods/payment_method_editor.dart @@ -8,20 +8,20 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; class PaymentMethodEditor extends StatefulWidget { - final PaymentMethod paymentMethod; + final PaymentMethod? paymentMethod; - const PaymentMethodEditor({Key key, this.paymentMethod}) : super(key: key); + const PaymentMethodEditor({Key? key, this.paymentMethod}) : super(key: key); @override _PaymentMethodEditorState createState() => _PaymentMethodEditorState(); } class _PaymentMethodEditorState extends State { bool _isLoading = false; - PaymentMethod _paymentMethod; + PaymentMethod? _paymentMethod; TextEditingController _nameController = new TextEditingController(); TextEditingController _accountNameController = new TextEditingController(); TextEditingController _accountNumberController = new TextEditingController(); @@ -29,7 +29,7 @@ class _PaymentMethodEditorState extends State { TextEditingController _phoneController = new TextEditingController(); TextEditingController _linkController = new TextEditingController(); - bool isNew; + late bool isNew; @override void initState() { @@ -38,12 +38,12 @@ class _PaymentMethodEditorState extends State { if (widget.paymentMethod != null) { _paymentMethod = widget.paymentMethod; - _nameController.text = _paymentMethod.name; - _accountNameController.text = _paymentMethod.accountName; - _accountNumberController.text = _paymentMethod.account; - _mailController.text = _paymentMethod.email; - _phoneController.text = _paymentMethod.phone; - _linkController.text = _paymentMethod.link; + _nameController.text = _paymentMethod!.name!; + _accountNameController.text = _paymentMethod!.accountName!; + _accountNumberController.text = _paymentMethod!.account!; + _mailController.text = _paymentMethod!.email!; + _phoneController.text = _paymentMethod!.phone!; + _linkController.text = _paymentMethod!.link!; } else { _paymentMethod = new PaymentMethod(); _nameController.text = ''; @@ -179,7 +179,7 @@ class _PaymentMethodEditorState extends State { }); try { PaymentMethod pm = PaymentMethod( - id: _paymentMethod.id, + id: _paymentMethod!.id, name: _nameController.text, accountName: _accountNameController.text, account: _accountNumberController.text, @@ -208,7 +208,7 @@ class _PaymentMethodEditorState extends State { }); try { await Provider.of(context, listen: false) - .deletePaymentMethod(_paymentMethod.id); + .deletePaymentMethod(_paymentMethod!.id!); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/payment_methods/payment_method_page.dart b/lib/pages/payment_methods/payment_method_page.dart index b03e94a..0fb95e2 100644 --- a/lib/pages/payment_methods/payment_method_page.dart +++ b/lib/pages/payment_methods/payment_method_page.dart @@ -12,7 +12,7 @@ import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; class PaymentMethodPage extends StatefulWidget { @@ -84,13 +84,13 @@ class _PaymentMethodPageState extends State { } _item(PaymentMethod method, bool isEditable) { - final accountName = _itemRow(method.accountName, "pm.account.name", + final accountName = _itemRow(method.accountName!, "pm.account.name", iconData: MaterialCommunityIcons.bank); - final accountNumber = _itemRow(method.account, "pm.account.no", + final accountNumber = _itemRow(method.account!, "pm.account.no", iconData: MaterialCommunityIcons.checkbook); - final phone = _itemRow(method.phone, "pm.phone", iconData: Icons.phone); - final email = _itemRow(method.email, "pm.email", iconData: Icons.mail); - final link = _itemRow(method.link, "pm.link", iconData: Icons.link); + final phone = _itemRow(method.phone!, "pm.phone", iconData: Icons.phone); + final email = _itemRow(method.email!, "pm.email", iconData: Icons.mail); + final link = _itemRow(method.link!, "pm.link", iconData: Icons.link); return InkWell( onTap: isEditable @@ -110,7 +110,7 @@ class _PaymentMethodPageState extends State { Padding( padding: const EdgeInsets.all(8.0), child: Text( - method.name, + method.name!, style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold, @@ -127,7 +127,7 @@ class _PaymentMethodPageState extends State { ); } - _itemRow(String text, String labelKey, {IconData iconData}) { + _itemRow(String text, String labelKey, {IconData? iconData}) { return text == null || text == "" ? Container() : Row( @@ -153,7 +153,7 @@ class _PaymentMethodPageState extends State { } void _showToast(String title) { - final ScaffoldState scaffold = key.currentState; + final ScaffoldState scaffold = key.currentState as ScaffoldState; scaffold.showSnackBar( SnackBar( content: Text('copied "$title" data to clipboard'), diff --git a/lib/pages/processing/model/processing_model.dart b/lib/pages/processing/model/processing_model.dart index e5782c8..0977245 100644 --- a/lib/pages/processing/model/processing_model.dart +++ b/lib/pages/processing/model/processing_model.dart @@ -11,7 +11,7 @@ class ProcessingModel extends BaseModel { List processings = []; final log = Logger('ProcessingModel'); - StreamSubscription listener; + StreamSubscription? listener; void initUser(user) { super.initUser(user); @@ -19,12 +19,12 @@ class ProcessingModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); processings = []; } - Future createProcessing(Processing processing) {} + Future createProcessing(Processing processing) async {} - Future updateProcessing(Processing processing) {} + Future updateProcessing(Processing processing) async {} } diff --git a/lib/pages/processing/package_editor.dart b/lib/pages/processing/package_editor.dart index 17a7292..458e3dc 100644 --- a/lib/pages/processing/package_editor.dart +++ b/lib/pages/processing/package_editor.dart @@ -18,14 +18,14 @@ import 'package:fcs/pages/widgets/multi_img_file.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; class PackageEditor extends StatefulWidget { - final Package package; - final User consignee; - final User sender; + final Package? package; + final User? consignee; + final User? sender; PackageEditor({this.package, this.consignee, this.sender}); @override @@ -38,20 +38,20 @@ class _PackageEditorState extends State { bool _isLoading = false; MultiImgController multiImgController = MultiImgController(); - Package _package; + Package? _package; @override void initState() { super.initState(); _package = Package(); - _loadPackageData(null); + _loadPackageData(widget.package!.id!); } _loadPackageData(String id) async { if (id != null) { PackageModel packageModel = Provider.of(context, listen: false); - Package package = await packageModel.getPackage(id); + Package? package = await packageModel.getPackage(id); if (package != null) { if (package.status != package_received_status) { showMsgDialog(context, "Error", @@ -64,10 +64,10 @@ class _PackageEditorState extends State { } } setState(() { - selectedMarket = _package.market ?? ""; - _descCtl.text = _package.desc; - _remarkCtl.text = _package.remark; - multiImgController.setImageUrls = _package.photoUrls; + selectedMarket = _package!.market ?? ""; + _descCtl.text = _package!.desc!; + _remarkCtl.text = _package!.remark!; + multiImgController.setImageUrls = _package!.photoUrls; }); } @@ -77,14 +77,14 @@ class _PackageEditorState extends State { children: [ Expanded( child: DisplayText( - text: _package.trackingID, + text: _package!.trackingID != null ? _package!.trackingID : "", labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, )), IconButton( icon: Icon(Icons.search, color: primaryColor), onPressed: () => searchPackage(context, callbackPackageSelect: (u) { - _loadPackageData(u.id); + _loadPackageData(u.id!); Navigator.pop(context); })), ], @@ -174,13 +174,13 @@ class _PackageEditorState extends State { ); } - String selectedMarket; + String? selectedMarket; Widget marketDropdown() { List _markets = Provider.of(context).markets; - List markets = _markets.map((e) => e.name).toList(); + List markets = _markets.map((e) => e.name).toList(); markets.insert(0, MANAGE_MARKET); if (!markets.contains(selectedMarket)) { - markets.insert(0, selectedMarket); + markets.insert(0, selectedMarket!); } return Row( @@ -210,7 +210,7 @@ class _PackageEditorState extends State { height: 1, color: Colors.grey, ), - onChanged: (String newValue) { + onChanged: (String? newValue) { setState(() { if (newValue == MANAGE_MARKET) { selectedMarket = null; @@ -221,7 +221,7 @@ class _PackageEditorState extends State { }); }, isExpanded: true, - items: markets.map>((String value) { + items: markets.map>((String? value) { return DropdownMenuItem( value: value, child: Text(value ?? "", @@ -254,14 +254,15 @@ class _PackageEditorState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - _package.market = selectedMarket; - _package.desc = _descCtl.text; - _package.remark = _remarkCtl.text; - _package.photoFiles = multiImgController.getUpdatedFile; - _package.fcsID = widget.consignee.fcsID; - _package.senderFCSID = widget.sender?.fcsID; + _package!.market = selectedMarket!; + _package!.desc = _descCtl.text; + _package!.remark = _remarkCtl.text; + _package!.photoFiles = multiImgController.getUpdatedFile; + _package!.fcsID = widget.consignee!.fcsID; + _package!.senderFCSID = + widget.sender!.fcsID != null ? widget.sender!.fcsID : ""; - await packageModel.updateProcessing(_package, + await packageModel.updateProcessing(_package!, multiImgController.getAddedFile, multiImgController.getDeletedUrl); Navigator.pop(context, _package); diff --git a/lib/pages/processing/processing_edit_editor.dart b/lib/pages/processing/processing_edit_editor.dart index 9c3678f..4751134 100644 --- a/lib/pages/processing/processing_edit_editor.dart +++ b/lib/pages/processing/processing_edit_editor.dart @@ -17,12 +17,12 @@ import 'package:fcs/pages/widgets/multi_img_file.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class ProcessingEditEditor extends StatefulWidget { - final Package package; + final Package? package; ProcessingEditEditor({this.package}); @override @@ -33,22 +33,22 @@ class _ProcessingEditEditorState extends State { TextEditingController _remarkCtl = new TextEditingController(); TextEditingController _descCtl = new TextEditingController(); - Package _package; - User _user; + Package? _package; + User? _user; bool _isLoading = false; @override void initState() { super.initState(); _package = widget.package; - selectedMarket = _package.market ?? ""; - _descCtl.text = _package.desc; - _remarkCtl.text = _package.remark; - multiImgController.setImageUrls = _package.photoUrls; + selectedMarket = _package!.market ?? ""; + _descCtl.text = _package!.desc!; + _remarkCtl.text = _package!.remark!; + multiImgController.setImageUrls = _package!.photoUrls; _user = User( - fcsID: _package.fcsID ?? "", - name: _package.userName ?? "", - phoneNumber: _package.phoneNumber ?? ""); + fcsID: _package!.fcsID ?? "", + name: _package!.userName ?? "", + phoneNumber: _package!.phoneNumber ?? ""); } final DateFormat dateFormat = DateFormat("d MMM yyyy"); @@ -62,7 +62,7 @@ class _ProcessingEditEditorState extends State { children: [ Expanded( child: DisplayText( - text: _user.fcsID, + text: _user!.fcsID, labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), @@ -76,18 +76,18 @@ class _ProcessingEditEditorState extends State { ], ); final namebox = DisplayText( - text: _user.name, + text: _user!.name, labelTextKey: "processing.name", iconData: Icons.person, ); final phoneNumberBox = DisplayText( - text: _user.phoneNumber, + text: _user!.phoneNumber, labelTextKey: "processing.phone", iconData: Icons.phone, ); final trackingIdBox = DisplayText( - text: _package.trackingID, + text: _package!.trackingID, labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); @@ -159,13 +159,13 @@ class _ProcessingEditEditorState extends State { ); } - String selectedMarket; + String? selectedMarket; Widget marketDropdown() { List _markets = Provider.of(context).markets; - List markets = _markets.map((e) => e.name).toList(); + List markets = _markets.map((e) => e.name).toList(); markets.insert(0, MANAGE_MARKET); if (!markets.contains(selectedMarket)) { - markets.insert(0, selectedMarket); + markets.insert(0, selectedMarket!); } return Padding( @@ -197,7 +197,7 @@ class _ProcessingEditEditorState extends State { height: 1, color: Colors.grey, ), - onChanged: (String newValue) { + onChanged: (String? newValue) { setState(() { if (newValue == MANAGE_MARKET) { selectedMarket = null; @@ -208,7 +208,7 @@ class _ProcessingEditEditorState extends State { }); }, isExpanded: true, - items: markets.map>((String value) { + items: markets.map>((String? value) { return DropdownMenuItem( value: value, child: Text(value ?? "", @@ -236,7 +236,7 @@ class _ProcessingEditEditorState extends State { } _completeProcessing() async { - if (_user.fcsID == null || _user.fcsID == "") { + if (_user!.fcsID == null || _user!.fcsID == "") { showMsgDialog(context, "Error", "Expected FCS-ID"); return; } @@ -246,11 +246,11 @@ class _ProcessingEditEditorState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - _package.fcsID = _user.fcsID; - _package.desc = _descCtl.text; - _package.remark = _remarkCtl.text; - _package.market = selectedMarket; - await packageModel.updateProcessing(_package, + _package!.fcsID = _user!.fcsID; + _package!.desc = _descCtl.text; + _package!.remark = _remarkCtl.text; + _package!.market = selectedMarket!; + await packageModel.updateProcessing(_package!, multiImgController.getAddedFile, multiImgController.getDeletedUrl); Navigator.pop(context); } catch (e) { @@ -264,20 +264,20 @@ class _ProcessingEditEditorState extends State { isDataChanged() { if (isNew) { - return _user.fcsID != "" || + return _user!.fcsID != "" || selectedMarket != null || _descCtl.text != "" || _remarkCtl.text != "" || multiImgController.getAddedFile.isNotEmpty; } else { var _package = Package( - trackingID: widget.package.trackingID, - fcsID: _user.fcsID, - market: selectedMarket, + trackingID: widget.package!.trackingID, + fcsID: _user!.fcsID, + market: selectedMarket!, desc: _descCtl.text, remark: _remarkCtl.text, - photoUrls: widget.package.photoUrls); - return widget.package.isChangedForEditProcessing(_package) || + photoUrls: widget.package!.photoUrls); + return widget.package!.isChangedForEditProcessing(_package) || multiImgController.getAddedFile.isNotEmpty || multiImgController.getDeletedUrl.isNotEmpty; } diff --git a/lib/pages/processing/processing_editor.dart b/lib/pages/processing/processing_editor.dart index 3618af4..3ae2505 100644 --- a/lib/pages/processing/processing_editor.dart +++ b/lib/pages/processing/processing_editor.dart @@ -11,14 +11,14 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; import 'model/processing_model.dart'; import 'package_editor.dart'; class ProcesingEditor extends StatefulWidget { - final Processing processing; + final Processing? processing; const ProcesingEditor({this.processing}); @override _ProcesingEditorState createState() => _ProcesingEditorState(); @@ -27,9 +27,9 @@ class ProcesingEditor extends StatefulWidget { class _ProcesingEditorState extends State { Processing processing = Processing(); bool _isLoading = false; - bool _isNew; - User consignee; - User sender; + late bool _isNew; + User? consignee; + User? sender; List packages = []; @override @@ -37,7 +37,7 @@ class _ProcesingEditorState extends State { super.initState(); _isNew = widget.processing == null; if (!_isNew) { - processing = widget.processing; + processing = widget.processing!; consignee = User( fcsID: processing.userID, name: processing.userName, @@ -56,7 +56,7 @@ class _ProcesingEditorState extends State { children: [ Expanded( child: DisplayText( - text: consignee != null ? consignee.fcsID : "", + text: consignee != null ? consignee!.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), @@ -71,14 +71,14 @@ class _ProcesingEditorState extends State { ); final phoneNumberBox = DisplayText( - text: consignee != null ? consignee.phoneNumber : "", + text: consignee != null ? consignee!.phoneNumber : "", labelTextKey: "processing.phone", maxLines: 2, iconData: Icons.phone, ); final namebox = DisplayText( - text: consignee != null ? consignee.name : "", + text: consignee != null ? consignee!.name : "", labelTextKey: "processing.consignee.name", maxLines: 2, iconData: Icons.person, @@ -98,7 +98,7 @@ class _ProcesingEditorState extends State { children: [ Expanded( child: DisplayText( - text: sender != null ? sender.fcsID : "", + text: sender != null ? sender!.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), @@ -113,14 +113,14 @@ class _ProcesingEditorState extends State { ); final shipperPhoneNumberBox = DisplayText( - text: sender != null ? sender.phoneNumber : "", + text: sender != null ? sender!.phoneNumber : "", labelTextKey: "processing.phone", maxLines: 2, iconData: Icons.phone, ); final shipperNamebox = DisplayText( - text: sender != null ? sender.name : "", + text: sender != null ? sender!.name : "", labelTextKey: "processing.shipper.name", maxLines: 2, iconData: Icons.person, @@ -152,7 +152,7 @@ class _ProcesingEditorState extends State { context, "Warning", "Please select 'Consignee'"); return; } - Package _package = await Navigator.push( + Package? _package = await Navigator.push( context, CupertinoPageRoute( builder: (context) => PackageEditor( @@ -160,7 +160,7 @@ class _ProcesingEditorState extends State { consignee: this.consignee, )), ); - _addPackage(_package); + _addPackage(_package!); // _savePackage(_package); }), ], @@ -230,10 +230,10 @@ class _ProcesingEditorState extends State { return packages.map((p) { return InkWell( onTap: () async { - Package _package = await Navigator.of(context).push( + Package? _package = await Navigator.of(context).push( CupertinoPageRoute( builder: (context) => PackageInfo(package: p))); - _savePackage(_package); + _savePackage(_package!); }, child: DisplayText( labelTextKey: "processing.tracking.id", @@ -273,7 +273,7 @@ class _ProcesingEditorState extends State { if (_isNew) { await processingModel.createProcessing(processing); } else { - processing.id = widget.processing.id; + processing.id = widget.processing!.id; await processingModel.updateProcessing(processing); } Navigator.pop(context); diff --git a/lib/pages/processing/processing_info.dart b/lib/pages/processing/processing_info.dart index 735de59..d15d0c9 100644 --- a/lib/pages/processing/processing_info.dart +++ b/lib/pages/processing/processing_info.dart @@ -11,7 +11,7 @@ import 'package:fcs/pages/widgets/progress.dart'; import 'package:fcs/pages/widgets/status_tree.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -20,7 +20,7 @@ import 'processing_edit_editor.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); class ProcessingInfo extends StatefulWidget { - final Package package; + final Package? package; ProcessingInfo({this.package}); @override @@ -29,14 +29,14 @@ class ProcessingInfo extends StatefulWidget { class _ProcessingInfoState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); - Package _package; + Package? _package; bool _isLoading = false; MultiImgController multiImgController = MultiImgController(); @override void initState() { super.initState(); - initPackage(widget.package); + initPackage(widget.package!); } initPackage(Package package) { @@ -54,52 +54,52 @@ class _ProcessingInfoState extends State { @override Widget build(BuildContext context) { final trackingIdBox = DisplayText( - text: _package.trackingID, + text: _package != null ? _package!.trackingID : '', labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); var fcsIDBox = DisplayText( - text: _package.fcsID, + text: _package != null ? _package!.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), ); final phoneNumberBox = DisplayText( - text: _package.phoneNumber, + text: _package != null ? _package!.phoneNumber : "", labelTextKey: "processing.phone", iconData: Icons.phone, ); final customerNameBox = DisplayText( - text: _package.userName, + text:_package!=null? _package!.userName:"", labelTextKey: "processing.consignee.name", iconData: Icons.perm_identity, ); var senderFcsIDBox = DisplayText( - text: _package.senderFCSID, + text:_package!=null? _package!.senderFCSID:"", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), ); final senderPhoneNumberBox = DisplayText( - text: _package.senderPhoneNumber, + text: _package!=null?_package!.senderPhoneNumber:"", labelTextKey: "processing.phone", iconData: Icons.phone, ); final senderNameBox = DisplayText( - text: _package.senderName, + text:_package!=null? _package!.senderName:"", labelTextKey: "processing.shipper.name", iconData: Icons.perm_identity, ); final marketBox = DisplayText( - text: _package.market ?? "-", + text:_package!=null? _package!.market : "-", labelTextKey: "processing.market", iconData: Icons.store, ); final descBox = DisplayText( - text: _package.desc ?? "-", + text:_package!=null? _package!.desc : "-", labelTextKey: "processing.desc", iconData: MaterialCommunityIcons.message_text_outline, ); final remarkBox = DisplayText( - text: _package.remark ?? "-", + text:_package!=null? _package!.remark : "-", labelTextKey: "processing.remark", iconData: Entypo.new_message, ); @@ -172,10 +172,10 @@ class _ProcessingInfoState extends State { marketBox, descBox, remarkBox, - _package.photoUrls.length == 0 ? Container() : img, + _package!.photoUrls.length == 0 ? Container() : img, StatusTree( - shipmentHistory: _package.shipmentHistory, - currentStatus: _package.status), + shipmentHistory: _package!.shipmentHistory, + currentStatus: _package!.status??""), SizedBox( height: 20, ) @@ -199,7 +199,7 @@ class _ProcessingInfoState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - await packageModel.deleteProcessing(_package); + await packageModel.deleteProcessing(_package!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -211,7 +211,7 @@ class _ProcessingInfoState extends State { } _gotoEditor() async { - bool deleted = await Navigator.push( + bool? deleted = await Navigator.push( context, CupertinoPageRoute( builder: (context) => ProcessingEditEditor( @@ -222,8 +222,8 @@ class _ProcessingInfoState extends State { } else { PackageModel packageModel = Provider.of(context, listen: false); - Package p = await packageModel.getPackage(_package.id); - initPackage(p); + Package? p = await packageModel.getPackage(_package!.id!); + initPackage(p!); } } } diff --git a/lib/pages/processing/processing_list.dart b/lib/pages/processing/processing_list.dart index 7f5855a..ec021b0 100644 --- a/lib/pages/processing/processing_list.dart +++ b/lib/pages/processing/processing_list.dart @@ -85,7 +85,7 @@ class _ProcessingListState extends State { _searchCallback(Package package) async { var packageModel = Provider.of(context, listen: false); - Package _package = await packageModel.getPackage(package.id); + Package? _package = await packageModel.getPackage(package.id!); if (_package == null) return; Navigator.push( context, diff --git a/lib/pages/processing/processing_list_row.dart b/lib/pages/processing/processing_list_row.dart index cc06c16..d702d4f 100644 --- a/lib/pages/processing/processing_list_row.dart +++ b/lib/pages/processing/processing_list_row.dart @@ -3,7 +3,7 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'processing_info.dart'; @@ -11,12 +11,12 @@ import 'processing_info.dart'; typedef CallbackPackageSelect(Package package); class ProcessingListRow extends StatelessWidget { - final Package package; - final CallbackPackageSelect callbackPackageSelect; + final Package? package; + final CallbackPackageSelect? callbackPackageSelect; final double dotSize = 15.0; final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); - ProcessingListRow({Key key, this.package, this.callbackPackageSelect}) + ProcessingListRow({Key? key, this.package, this.callbackPackageSelect}) : super(key: key); @override @@ -24,7 +24,7 @@ class ProcessingListRow extends StatelessWidget { return InkWell( onTap: () { if (callbackPackageSelect != null) { - callbackPackageSelect(package); + callbackPackageSelect!(package!); return; } Navigator.push( @@ -57,7 +57,7 @@ class ProcessingListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.id == null ? '' : package.trackingID, + package!.id == null ? '' : package!.trackingID!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -65,7 +65,7 @@ class ProcessingListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.market == null ? '' : package.market, + package!.market == null ? '' : package!.market!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -81,12 +81,14 @@ class ProcessingListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(3.0), - child: getStatus(package.status), + child: getStatus(package!.status??""), ), Padding( padding: const EdgeInsets.all(0), child: new Text( - dateFormat.format(package.currentStatusDate), + package!.currentStatusDate != null + ? dateFormat.format(package!.currentStatusDate!) + : '', style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), ), diff --git a/lib/pages/processing_old/processing_editor.dart b/lib/pages/processing_old/processing_editor.dart index 634247d..59e0a3c 100644 --- a/lib/pages/processing_old/processing_editor.dart +++ b/lib/pages/processing_old/processing_editor.dart @@ -18,12 +18,12 @@ import 'package:fcs/pages/widgets/multi_img_file.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class ProcessingEditor extends StatefulWidget { - final Package package; + final Package? package; ProcessingEditor({this.package}); @override @@ -34,22 +34,22 @@ class _ProcessingEditorState extends State { TextEditingController _remarkCtl = new TextEditingController(); TextEditingController _descCtl = new TextEditingController(); - Package _package; - User _user; + Package? _package; + User? _user; bool _isLoading = false; @override void initState() { super.initState(); _package = widget.package; - selectedMarket = _package.market ?? ""; - _descCtl.text = _package.desc; - _remarkCtl.text = _package.remark; - multiImgController.setImageUrls = _package.photoUrls; + selectedMarket = _package!.market ?? ""; + _descCtl.text = _package!.desc!; + _remarkCtl.text = _package!.remark!; + multiImgController.setImageUrls = _package!.photoUrls; _user = User( - fcsID: _package.fcsID ?? "", - name: _package.userName ?? "", - phoneNumber: _package.phoneNumber ?? ""); + fcsID: _package!.fcsID ?? "", + name: _package!.userName ?? "", + phoneNumber: _package!.phoneNumber ?? ""); } final DateFormat dateFormat = DateFormat("d MMM yyyy"); @@ -63,7 +63,7 @@ class _ProcessingEditorState extends State { children: [ Expanded( child: DisplayText( - text: _user.fcsID, + text: _user!.fcsID??"", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), @@ -77,18 +77,18 @@ class _ProcessingEditorState extends State { ], ); final namebox = DisplayText( - text: _user.name, + text: _user!.name??"", labelTextKey: "processing.name", iconData: Icons.person, ); final phoneNumberBox = DisplayText( - text: _user.phoneNumber, + text: _user!.phoneNumber??"", labelTextKey: "processing.phone", iconData: Icons.phone, ); final trackingIdBox = DisplayText( - text: _package.trackingID, + text: _package!.trackingID??"", labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); @@ -152,13 +152,13 @@ class _ProcessingEditorState extends State { ); } - String selectedMarket; + String? selectedMarket; Widget marketDropdown() { List _markets = Provider.of(context).markets; - List markets = _markets.map((e) => e.name).toList(); + List markets = _markets.map((e) => e.name).toList(); markets.insert(0, MANAGE_MARKET); if (!markets.contains(selectedMarket)) { - markets.insert(0, selectedMarket); + markets.insert(0, selectedMarket!); } return Padding( @@ -190,7 +190,7 @@ class _ProcessingEditorState extends State { height: 1, color: Colors.grey, ), - onChanged: (String newValue) { + onChanged: (String? newValue) { setState(() { if (newValue == MANAGE_MARKET) { selectedMarket = null; @@ -201,7 +201,7 @@ class _ProcessingEditorState extends State { }); }, isExpanded: true, - items: markets.map>((String value) { + items: markets.map>((String? value) { return DropdownMenuItem( value: value, child: Text(value ?? "", @@ -229,7 +229,7 @@ class _ProcessingEditorState extends State { } _completeProcessing() async { - if (_user.fcsID == null || _user.fcsID == "") { + if (_user!.fcsID == null || _user!.fcsID == "") { showMsgDialog(context, "Error", "Expected FCS-ID"); return; } @@ -239,11 +239,11 @@ class _ProcessingEditorState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - _package.fcsID = _user.fcsID; - _package.desc = _descCtl.text; - _package.remark = _remarkCtl.text; - _package.market = selectedMarket; - await packageModel.updateProcessing(_package, + _package!.fcsID = _user!.fcsID; + _package!.desc = _descCtl.text; + _package!.remark = _remarkCtl.text; + _package!.market = selectedMarket; + await packageModel.updateProcessing(_package!, multiImgController.getAddedFile, multiImgController.getDeletedUrl); Navigator.pop(context); } catch (e) { diff --git a/lib/pages/processing_old/processing_info.dart b/lib/pages/processing_old/processing_info.dart index 0b6fe43..d48a433 100644 --- a/lib/pages/processing_old/processing_info.dart +++ b/lib/pages/processing_old/processing_info.dart @@ -12,7 +12,8 @@ import 'package:fcs/pages/widgets/progress.dart'; import 'package:fcs/pages/widgets/status_tree.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; + import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -21,7 +22,7 @@ import 'processing_editor.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); class ProcessingInfo extends StatefulWidget { - final Package package; + final Package? package; ProcessingInfo({this.package}); @override @@ -30,14 +31,14 @@ class ProcessingInfo extends StatefulWidget { class _ProcessingInfoState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); - Package _package; + Package? _package; bool _isLoading = false; MultiImgController multiImgController = MultiImgController(); @override void initState() { super.initState(); - initPackage(widget.package); + initPackage(widget.package!); } initPackage(Package package) { @@ -55,37 +56,37 @@ class _ProcessingInfoState extends State { @override Widget build(BuildContext context) { final trackingIdBox = DisplayText( - text: _package.trackingID, + text: _package!.trackingID ?? "", labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); var fcsIDBox = DisplayText( - text: _package.fcsID, + text: _package!.fcsID??"", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), ); final phoneNumberBox = DisplayText( - text: _package.phoneNumber, + text: _package!.phoneNumber??"", labelTextKey: "processing.phone", iconData: Icons.phone, ); final customerNameBox = DisplayText( - text: _package.userName, + text: _package!.userName??"", labelTextKey: "processing.name", iconData: Icons.perm_identity, ); final marketBox = DisplayText( - text: _package.market ?? "-", + text: _package!.market ?? "-", labelTextKey: "processing.market", iconData: Icons.store, ); final descBox = DisplayText( - text: _package.desc ?? "-", + text: _package!.desc ?? "-", labelTextKey: "processing.desc", iconData: MaterialCommunityIcons.message_text_outline, ); final remarkBox = DisplayText( - text: _package.remark ?? "-", + text: _package!.remark ?? "-", labelTextKey: "processing.remark", iconData: Entypo.new_message, ); @@ -137,10 +138,10 @@ class _ProcessingInfoState extends State { marketBox, descBox, remarkBox, - _package.photoUrls.length == 0 ? Container() : img, + _package!.photoUrls.length == 0 ? Container() : img, StatusTree( - shipmentHistory: _package.shipmentHistory, - currentStatus: _package.status), + shipmentHistory: _package!.shipmentHistory, + currentStatus: _package!.status??""), SizedBox( height: 20, ) @@ -164,7 +165,7 @@ class _ProcessingInfoState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - await packageModel.deleteProcessing(_package); + await packageModel.deleteProcessing(_package!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -176,19 +177,19 @@ class _ProcessingInfoState extends State { } _gotoEditor() async { - bool deleted = await Navigator.push( + bool? deleted = await Navigator.push( context, CupertinoPageRoute( builder: (context) => ProcessingEditor( - package: widget.package, + package: widget.package!, ))); if (deleted ?? false) { Navigator.pop(context); } else { PackageModel packageModel = Provider.of(context, listen: false); - Package p = await packageModel.getPackage(_package.id); - initPackage(p); + Package? p = await packageModel.getPackage(_package!.id!); + initPackage(p!); } } } diff --git a/lib/pages/processing_old/processing_list.dart b/lib/pages/processing_old/processing_list.dart index 6ab3497..38e5c0a 100644 --- a/lib/pages/processing_old/processing_list.dart +++ b/lib/pages/processing_old/processing_list.dart @@ -77,7 +77,7 @@ class _ProcessingListState extends State { _searchCallback(Package package) async { var packageModel = Provider.of(context, listen: false); - Package _package = await packageModel.getPackage(package.id); + Package? _package = await packageModel.getPackage(package.id!); if (_package == null) return; Navigator.push( context, diff --git a/lib/pages/processing_old/processing_list_row.dart b/lib/pages/processing_old/processing_list_row.dart index cc06c16..a287b2c 100644 --- a/lib/pages/processing_old/processing_list_row.dart +++ b/lib/pages/processing_old/processing_list_row.dart @@ -3,7 +3,7 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'processing_info.dart'; @@ -11,12 +11,12 @@ import 'processing_info.dart'; typedef CallbackPackageSelect(Package package); class ProcessingListRow extends StatelessWidget { - final Package package; - final CallbackPackageSelect callbackPackageSelect; + final Package? package; + final CallbackPackageSelect? callbackPackageSelect; final double dotSize = 15.0; final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); - ProcessingListRow({Key key, this.package, this.callbackPackageSelect}) + ProcessingListRow({Key? key, this.package, this.callbackPackageSelect}) : super(key: key); @override @@ -24,7 +24,7 @@ class ProcessingListRow extends StatelessWidget { return InkWell( onTap: () { if (callbackPackageSelect != null) { - callbackPackageSelect(package); + callbackPackageSelect!(package!); return; } Navigator.push( @@ -45,7 +45,7 @@ class ProcessingListRow extends StatelessWidget { Container( padding: EdgeInsets.only(left: 5, right: 10), child: Icon( - FontAwesome.dropbox, + FontAwesomeIcons.dropbox, color: primaryColor, size: 30, ), @@ -57,7 +57,7 @@ class ProcessingListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.id == null ? '' : package.trackingID, + package!.id == null ? '' : package!.trackingID!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -65,7 +65,7 @@ class ProcessingListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.market == null ? '' : package.market, + package!.market == null ? '' : package!.market!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -81,12 +81,14 @@ class ProcessingListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(3.0), - child: getStatus(package.status), + child: getStatus(package!.status ?? ""), ), Padding( padding: const EdgeInsets.all(0), child: new Text( - dateFormat.format(package.currentStatusDate), + package!.currentStatusDate != null + ? dateFormat.format(package!.currentStatusDate!) + : '', style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), ), diff --git a/lib/pages/profile/profile_currency_edit.dart b/lib/pages/profile/profile_currency_edit.dart index 92fe1c8..db76f8d 100644 --- a/lib/pages/profile/profile_currency_edit.dart +++ b/lib/pages/profile/profile_currency_edit.dart @@ -1,6 +1,4 @@ import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/localization/app_translations.dart'; -import 'package:fcs/pages/main/model/language_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; @@ -26,7 +24,7 @@ class _ProfileCurrencyEditState extends State { void initState() { super.initState(); MainModel mainModel = Provider.of(context, listen: false); - if (mainModel.user.preferCurrency == "MMK") { + if (mainModel.user!.preferCurrency == "MMK") { _currency = Currency.MMK; } else { _currency = Currency.USD; @@ -76,7 +74,8 @@ class _ProfileCurrencyEditState extends State { activeColor: primaryColor, value: Currency.USD, groupValue: _currency, - onChanged: (Currency value) { + onChanged: (Currency? value) { + if(value != null) setState(() { _currency = value; }); @@ -94,7 +93,8 @@ class _ProfileCurrencyEditState extends State { activeColor: primaryColor, value: Currency.MMK, groupValue: _currency, - onChanged: (Currency value) { + onChanged: (Currency? value) { + if(value != null) setState(() { _currency = value; }); diff --git a/lib/pages/profile/profile_edit.dart b/lib/pages/profile/profile_edit.dart index a4ab671..9880a87 100644 --- a/lib/pages/profile/profile_edit.dart +++ b/lib/pages/profile/profile_edit.dart @@ -24,7 +24,7 @@ class _ProfileEditState extends State { void initState() { super.initState(); MainModel mainModel = Provider.of(context, listen: false); - nameController.text = mainModel.user.name; + nameController.text = mainModel.user!.name ?? ""; } @override @@ -39,7 +39,7 @@ class _ProfileEditState extends State { cursorColor: primaryColor, style: textStyle, decoration: new InputDecoration( - labelText: AppTranslations.of(context).text("profile.name"), + labelText: AppTranslations.of(context)!.text("profile.name"), labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, icon: Icon( Icons.person, diff --git a/lib/pages/profile/profile_page.dart b/lib/pages/profile/profile_page.dart index 67395f9..3732104 100644 --- a/lib/pages/profile/profile_page.dart +++ b/lib/pages/profile/profile_page.dart @@ -1,9 +1,7 @@ import 'package:fcs/domain/entities/user.dart'; -import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/domain/vo/privilege.dart'; import 'package:fcs/localization/transalation.dart'; import 'package:fcs/pages/delivery_address/delivery_address_list.dart'; -import 'package:fcs/pages/delivery_address/delivery_address_row.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/main/model/language_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; @@ -11,7 +9,6 @@ import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/profile/profile_currency_edit.dart'; import 'package:fcs/pages/profile/profile_edit.dart'; import 'package:fcs/pages/staff/model/staff_model.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/fcs_id_icon.dart'; @@ -20,8 +17,8 @@ import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_icons/flutter_icons.dart'; import 'package:provider/provider.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import '../../helpers/theme.dart'; @@ -35,7 +32,7 @@ class Profile extends StatefulWidget { class _ProfileState extends State { GlobalKey key = GlobalKey(); bool _isLoading = false; - String selectedLanguage; + String? selectedLanguage; TextEditingController bizNameController = new TextEditingController(); static final List languagesList = Translation().supportedLanguages; @@ -71,18 +68,19 @@ class _ProfileState extends State { Provider.of(context); final namebox = DisplayText( - text: mainModel.user.name + " (${mainModel.user.status})", + text: "${mainModel.user!.name ?? ''}" + + " (${mainModel.user!.status ?? ''})", labelTextKey: "profile.name", iconData: Icons.person, ); final currencyBox = DisplayText( - text: mainModel.user.preferCurrency, + text: mainModel.user!.preferCurrency ?? "", labelTextKey: "profile.currency", - iconData: FontAwesome5.money_bill_alt, + iconData: FontAwesome5Regular.money_bill_alt, ); final phonenumberbox = DisplayText( - text: mainModel.user.phone, + text: mainModel.user!.phone, labelTextKey: "profile.phone", iconData: Icons.phone, ); @@ -90,15 +88,15 @@ class _ProfileState extends State { children: [ Expanded( child: DisplayText( - text: mainModel.user.fcsID, + text: mainModel.user!.fcsID ?? "", labelTextKey: "customer.fcs.id", icon: FcsIDIcon(), ), ), IconButton( icon: Icon(Icons.content_copy, color: Colors.grey), - onPressed: () => _copy( - getLocalString(context, "customer.fcs.id"), mainModel.user.fcsID), + onPressed: () => _copy(getLocalString(context, "customer.fcs.id"), + mainModel.user!.fcsID ?? ""), ) ], ); @@ -107,7 +105,7 @@ class _ProfileState extends State { children: [ Expanded( child: DisplayText( - text: mainModel.setting.usaAddress, + text: mainModel.setting!.usaAddress ?? "", labelTextKey: "profile.usa.shipping.address", iconData: Icons.location_on, ), @@ -116,7 +114,7 @@ class _ProfileState extends State { icon: Icon(Icons.content_copy, color: Colors.grey), onPressed: () => _copy( getLocalString(context, "profile.usa.shipping.address"), - mainModel.setting.usaAddress), + mainModel.setting!.usaAddress ?? ""), ) ], ); @@ -199,14 +197,14 @@ class _ProfileState extends State { } Widget getPrivilegeBox(BuildContext context) { - User user = Provider.of(context, listen: false).user; + User? user = Provider.of(context, listen: false).user; List _privileges = Provider.of(context, listen: false).privileges; if (user == null || user.isCustomer()) return Container(); List privileges = []; user.privileges.forEach((e) { - var p = _privileges.firstWhere((p) => p.id == e, orElse: () => null); + var p = _privileges.firstWhere((p) => p.id == e); if (p != null) { privileges.add(p); } @@ -274,7 +272,7 @@ class _ProfileState extends State { } _showToast(String title) { - final ScaffoldState scaffold = key.currentState; + final ScaffoldState scaffold = key.currentState as ScaffoldState; scaffold.showSnackBar( SnackBar( content: Text('copied "$title" data to clipboard'), diff --git a/lib/pages/rates/cargo_editor.dart b/lib/pages/rates/cargo_editor.dart index d084754..2c25d86 100644 --- a/lib/pages/rates/cargo_editor.dart +++ b/lib/pages/rates/cargo_editor.dart @@ -11,7 +11,7 @@ import 'package:provider/provider.dart'; import 'model/shipment_rate_model.dart'; class CargoEditor extends StatefulWidget { - final CargoType cargo; + final CargoType? cargo; CargoEditor({this.cargo}); @override @@ -23,15 +23,15 @@ class _CargoEditorState extends State { TextEditingController _rateController = new TextEditingController(); bool _isLoading = false; - CargoType _cargo; + late CargoType _cargo; bool _isNew = false; @override void initState() { super.initState(); if (widget.cargo != null) { - _cargo = widget.cargo; - _descController.text = _cargo.name; + _cargo = widget.cargo!; + _descController.text = _cargo.name ?? ""; _rateController.text = _cargo.rate.toStringAsFixed(2); } else { _isNew = true; @@ -71,7 +71,7 @@ class _CargoEditorState extends State { }, ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("cargo.form.title")), + title: Text(AppTranslations.of(context)!.text("cargo.form.title")), actions: [ IconButton( icon: Icon(Icons.delete), @@ -114,7 +114,7 @@ class _CargoEditorState extends State { if (_isNew) { await shipmentRateModel.addCargoType(_cargo); } else { - _cargo.id = widget.cargo.id; + _cargo.id = this._cargo.id; await shipmentRateModel.updateCargoType(_cargo); } Navigator.pop(context); @@ -138,7 +138,7 @@ class _CargoEditorState extends State { try { var shipmentRateModel = Provider.of(context, listen: false); - await shipmentRateModel.deleteCargoType(widget.cargo.id); + await shipmentRateModel.deleteCargoType(this._cargo.id!); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -155,7 +155,7 @@ class _CargoEditorState extends State { } else { CargoType _cargo = CargoType( name: _descController.text, rate: double.parse(_rateController.text)); - return widget.cargo.isChangedForEdit(_cargo); + return this._cargo.isChangedForEdit(_cargo); } } } diff --git a/lib/pages/rates/cargo_type_list.dart b/lib/pages/rates/cargo_type_list.dart index 1e766c3..0fab20a 100644 --- a/lib/pages/rates/cargo_type_list.dart +++ b/lib/pages/rates/cargo_type_list.dart @@ -10,7 +10,7 @@ import 'cargo_editor.dart'; import 'model/shipment_rate_model.dart'; class CargoTypeList extends StatefulWidget { - const CargoTypeList({Key key}) : super(key: key); + const CargoTypeList({Key? key}) : super(key: key); @override _CargoTypeListState createState() => _CargoTypeListState(); } @@ -75,7 +75,7 @@ class _CargoTypeListState extends State { ))); }, child: Container( - child: _row(cargo.name, + child: _row(cargo.name ?? "", "\$ " + cargo.rate.toStringAsFixed(2), 'per pound'), ), ); diff --git a/lib/pages/rates/custom_editor.dart b/lib/pages/rates/custom_editor.dart index 018804d..bec5ddb 100644 --- a/lib/pages/rates/custom_editor.dart +++ b/lib/pages/rates/custom_editor.dart @@ -12,7 +12,7 @@ import 'package:provider/provider.dart'; import 'model/shipment_rate_model.dart'; class CustomEditor extends StatefulWidget { - final CargoType custom; + final CargoType? custom; CustomEditor({this.custom}); @override @@ -32,8 +32,8 @@ class _CustomEditorState extends State { void initState() { super.initState(); if (widget.custom != null) { - _custom = widget.custom; - _productController.text = _custom.name; + _custom = widget.custom!; + _productController.text = _custom.name??""; _feeController.text = _custom.customDutyFee.toStringAsFixed(2); _shipmentRateController.text = _custom.rate == null ? "" : _custom.rate.toStringAsFixed(2); @@ -83,7 +83,7 @@ class _CustomEditorState extends State { ), backgroundColor: primaryColor, title: - Text(AppTranslations.of(context).text("rate.custom.form.title")), + Text(AppTranslations.of(context)!.text("rate.custom.form.title")), actions: [ IconButton( icon: Icon(Icons.delete), @@ -129,7 +129,7 @@ class _CustomEditorState extends State { if (_isNew) { await shipmentRateModel.addCustomDuty(_customduty); } else { - _customduty.id = widget.custom.id; + _customduty.id = this._custom.id; await shipmentRateModel.updateCustomDuty(_customduty); } Navigator.pop(context); @@ -154,7 +154,7 @@ class _CustomEditorState extends State { try { var shipmentRateModel = Provider.of(context, listen: false); - await shipmentRateModel.deleteCustomDuty(widget.custom.id); + await shipmentRateModel.deleteCustomDuty(this._custom.id!); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -175,7 +175,7 @@ class _CustomEditorState extends State { name: _productController.text, customDutyFee: double.parse(_feeController.text), rate: double.parse(_shipmentRateController.text)); - return widget.custom.isChangedForEditCustomDuty(_customduty); + return this._custom.isChangedForEditCustomDuty(_customduty); } } } diff --git a/lib/pages/rates/custom_list.dart b/lib/pages/rates/custom_list.dart index bbff27c..f5a1dc9 100644 --- a/lib/pages/rates/custom_list.dart +++ b/lib/pages/rates/custom_list.dart @@ -1,11 +1,6 @@ import 'package:fcs/domain/entities/cargo_type.dart'; -import 'package:fcs/domain/entities/custom_duty.dart'; -import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/delivery_address/delivery_address_editor.dart'; -import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/rates/custom_editor.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; @@ -14,8 +9,8 @@ import 'package:provider/provider.dart'; import 'model/shipment_rate_model.dart'; class CustomList extends StatefulWidget { - final bool selected; - const CustomList({Key key, this.selected}) : super(key: key); + final bool? selected; + const CustomList({Key? key, this.selected}) : super(key: key); @override _CustomListState createState() => _CustomListState(); } @@ -28,7 +23,7 @@ class _CustomListState extends State { void initState() { super.initState(); if (widget.selected != null) { - _selected = widget.selected; + _selected = widget.selected!; } } @@ -86,11 +81,12 @@ class _CustomListState extends State { }, child: Container( child: _row( - custom.name, + custom.name??"", "Custom Fee \$ " + custom.customDutyFee.toStringAsFixed(2), custom.rate == null ? "" - : "Shipment rate \$ " + custom.rate.toStringAsFixed(2)), + : "Shipment rate \$ " + + custom.rate.toStringAsFixed(2)), ), ); }), diff --git a/lib/pages/rates/custom_row.dart b/lib/pages/rates/custom_row.dart index 87a1a89..359c1b8 100644 --- a/lib/pages/rates/custom_row.dart +++ b/lib/pages/rates/custom_row.dart @@ -1,17 +1,16 @@ import 'package:fcs/domain/entities/custom_duty.dart'; -import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; typedef SelectionCallback(CustomDuty custom); class CustomRow extends StatelessWidget { final CustomDuty custom; - final SelectionCallback selectionCallback; - const CustomRow({Key key, this.custom, this.selectionCallback}) + final SelectionCallback? selectionCallback; + const CustomRow({Key? key, required this.custom, this.selectionCallback}) : super(key: key); @override @@ -19,7 +18,7 @@ class CustomRow extends StatelessWidget { return InkWell( onTap: selectionCallback == null ? null - : () => this.selectionCallback(custom), + : () => this.selectionCallback!(custom), child: Row( children: [ Expanded( @@ -40,8 +39,8 @@ class CustomRow extends StatelessWidget { ); } - Widget line(BuildContext context, String text, - {IconData iconData, Color color, double fontSize}) { + Widget line(BuildContext context, String? text, + {IconData? iconData, Color? color, double? fontSize}) { return Row( children: [ iconData == null @@ -55,7 +54,7 @@ class CustomRow extends StatelessWidget { context, text ?? "", fontSize: fontSize ?? 14, - color: color, + color: color ?? Colors.grey, ), ), ], diff --git a/lib/pages/rates/discount_by weight_list.dart b/lib/pages/rates/discount_by weight_list.dart index 73b7467..ad54af2 100644 --- a/lib/pages/rates/discount_by weight_list.dart +++ b/lib/pages/rates/discount_by weight_list.dart @@ -1,24 +1,16 @@ -import 'package:fcs/domain/entities/custom_duty.dart'; -import 'package:fcs/domain/entities/discount.dart'; import 'package:fcs/domain/entities/discount_by_weight.dart'; -import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/delivery_address/delivery_address_editor.dart'; -import 'package:fcs/pages/main/util.dart'; -import 'package:fcs/pages/rates/custom_editor.dart'; import 'package:fcs/pages/rates/discount_by_weight_editor.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'custom_row.dart'; import 'model/shipment_rate_model.dart'; class DiscountByWeightList extends StatefulWidget { - const DiscountByWeightList({Key key}) : super(key: key); + const DiscountByWeightList({Key? key}) : super(key: key); @override _DiscountByWeightListState createState() => _DiscountByWeightListState(); } diff --git a/lib/pages/rates/discount_by_weight_editor.dart b/lib/pages/rates/discount_by_weight_editor.dart index 973d156..11096fd 100644 --- a/lib/pages/rates/discount_by_weight_editor.dart +++ b/lib/pages/rates/discount_by_weight_editor.dart @@ -11,7 +11,7 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; class DiscountByWeightEditor extends StatefulWidget { - final DiscountByWeight discountByWeight; + final DiscountByWeight? discountByWeight; DiscountByWeightEditor({this.discountByWeight}); @override @@ -23,14 +23,14 @@ class _DiscountByWeightEditorState extends State { TextEditingController _discountController = new TextEditingController(); bool _isLoading = false; - bool _isNew; + bool _isNew = false; DiscountByWeight _discountByWeight = new DiscountByWeight(); @override void initState() { super.initState(); if (widget.discountByWeight != null) { - _discountByWeight = widget.discountByWeight; + _discountByWeight = widget.discountByWeight!; _weightController.text = _discountByWeight.weight.toStringAsFixed(2); _discountController.text = _discountByWeight.discount.toString(); _isNew = false; @@ -73,7 +73,7 @@ class _DiscountByWeightEditorState extends State { }, ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("discount.new")), + title: Text(AppTranslations.of(context)!.text("discount.new")), actions: [ IconButton( icon: Icon(Icons.delete), @@ -117,7 +117,7 @@ class _DiscountByWeightEditorState extends State { if (_isNew) { await shipmentRateModel.addDiscountByWeight(_discount); } else { - _discount.id = widget.discountByWeight.id; + _discount.id = this._discountByWeight.id; await shipmentRateModel.updateDiscountByWeight(_discount); } Navigator.pop(context); @@ -143,7 +143,7 @@ class _DiscountByWeightEditorState extends State { var shipmentRateModel = Provider.of(context, listen: false); await shipmentRateModel - .deleteDiscountByWeight(widget.discountByWeight.id); + .deleteDiscountByWeight(this._discountByWeight.id!); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -161,7 +161,7 @@ class _DiscountByWeightEditorState extends State { DiscountByWeight _discount = DiscountByWeight( weight: double.parse(_weightController.text), discount: double.parse(_discountController.text)); - return widget.discountByWeight.isChangedForEdit(_discount); + return this._discountByWeight.isChangedForEdit(_discount); } } } diff --git a/lib/pages/rates/model/shipment_rate_model.dart b/lib/pages/rates/model/shipment_rate_model.dart index 4304dc1..83ba871 100644 --- a/lib/pages/rates/model/shipment_rate_model.dart +++ b/lib/pages/rates/model/shipment_rate_model.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:fcs/data/services/services.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; -import 'package:fcs/domain/entities/custom_duty.dart'; import 'package:fcs/domain/entities/discount_by_weight.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/pages/main/model/base_model.dart'; @@ -11,12 +10,12 @@ import 'package:logging/logging.dart'; class ShipmentRateModel extends BaseModel { final log = Logger('ShipmentRateModel'); - StreamSubscription listener; - Rate rate; + StreamSubscription? listener; + late Rate rate; void initUser(user) { super.initUser(user); - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); listener = Services.instance.rateService.getRateStream().listen((rate) { this.rate = rate; notifyListeners(); @@ -25,7 +24,7 @@ class ShipmentRateModel extends BaseModel { @override logout() async { - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); } // Rate @@ -51,12 +50,12 @@ class ShipmentRateModel extends BaseModel { //CustomDuty Future addCustomDuty(CargoType customDuty) { - customDuty.isCutomDuty=true; + customDuty.isCutomDuty = true; return Services.instance.rateService.createCargoType(customDuty); } Future updateCustomDuty(CargoType customDuty) { - customDuty.isCutomDuty=true; + customDuty.isCutomDuty = true; return Services.instance.rateService.updateCargoType(customDuty); } diff --git a/lib/pages/rates/shipment_rates.dart b/lib/pages/rates/shipment_rates.dart index ff4d865..1613d70 100644 --- a/lib/pages/rates/shipment_rates.dart +++ b/lib/pages/rates/shipment_rates.dart @@ -1,5 +1,4 @@ import 'package:fcs/domain/entities/cargo_type.dart'; -import 'package:fcs/domain/entities/custom_duty.dart'; import 'package:fcs/domain/entities/discount_by_weight.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/helpers/theme.dart'; @@ -185,8 +184,8 @@ class _ShipmentRatesState extends State { List getCargoWidget(List cargos) { return cargos.map((cargo) { return Container( - child: _row( - cargo.name, "\$ " + cargo.rate.toStringAsFixed(2), 'per pound'), + child: _row(cargo.name ?? "", "\$ " + cargo.rate.toStringAsFixed(2), + 'per pound'), ); }).toList(); } @@ -194,7 +193,8 @@ class _ShipmentRatesState extends State { List getCustonWidget(List customs) { return customs.map((c) { return Container( - child: _row(c.name, "\$ " + c.customDutyFee.toStringAsFixed(2), ''), + child: + _row(c.name ?? "", "\$ " + c.customDutyFee.toStringAsFixed(2), ''), ); }).toList(); } diff --git a/lib/pages/rates/shipment_rates_calculate.dart b/lib/pages/rates/shipment_rates_calculate.dart index 8d21d54..c722c86 100644 --- a/lib/pages/rates/shipment_rates_calculate.dart +++ b/lib/pages/rates/shipment_rates_calculate.dart @@ -2,7 +2,6 @@ import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/rates/model/shipment_rate_model.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/input_text.dart'; @@ -12,7 +11,7 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:provider/provider.dart'; class ShipmentRatesCal extends StatefulWidget { @@ -24,7 +23,7 @@ class ShipmentRatesCal extends StatefulWidget { class _ShipmentRatesCalState extends State { bool _isLoading = false; - CargoType _cargoType; + late CargoType _cargoType; TextEditingController _widthController = new TextEditingController(); TextEditingController _heightController = new TextEditingController(); TextEditingController _lengthController = new TextEditingController(); diff --git a/lib/pages/rates/shipment_rates_edit.dart b/lib/pages/rates/shipment_rates_edit.dart index b85f5aa..c5590c3 100644 --- a/lib/pages/rates/shipment_rates_edit.dart +++ b/lib/pages/rates/shipment_rates_edit.dart @@ -1,12 +1,8 @@ -import 'package:fcs/domain/entities/cargo_type.dart'; -import 'package:fcs/domain/entities/custom_duty.dart'; -import 'package:fcs/domain/entities/discount_by_weight.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/rates/model/shipment_rate_model.dart'; import 'package:fcs/pages/widgets/input_text.dart'; -import 'package:fcs/pages/widgets/my_data_table.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -14,8 +10,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; import '../main/util.dart'; -import 'cargo_editor.dart'; -import 'custom_editor.dart'; class ShipmentRatesEdit extends StatefulWidget { ShipmentRatesEdit(); @@ -32,7 +26,7 @@ class _ShipmentRatesEditState extends State { TextEditingController _diffDiscountWeight = new TextEditingController(); TextEditingController _diffWeightRate = new TextEditingController(); - Rate rate; + late Rate rate; @override void initState() { @@ -41,12 +35,11 @@ class _ShipmentRatesEditState extends State { Provider.of(context, listen: false); rate = shipmentRateModel.rate; - _minWeight.text = rate.freeDeliveryWeight?.toStringAsFixed(2) ?? ""; - _deliveryFee.text = rate.deliveryFee?.toStringAsFixed(2) ?? ""; - _volumetricRatio.text = rate.volumetricRatio?.toStringAsFixed(2) ?? ""; - _diffDiscountWeight.text = - rate.diffDiscountWeight?.toStringAsFixed(2) ?? ""; - _diffWeightRate.text = rate.diffWeightRate?.toStringAsFixed(2) ?? ""; + _minWeight.text = rate.freeDeliveryWeight.toStringAsFixed(2); + _deliveryFee.text = rate.deliveryFee.toStringAsFixed(2); + _volumetricRatio.text = rate.volumetricRatio.toStringAsFixed(2); + _diffDiscountWeight.text = rate.diffDiscountWeight.toStringAsFixed(2); + _diffWeightRate.text = rate.diffWeightRate.toStringAsFixed(2); } @override @@ -99,7 +92,7 @@ class _ShipmentRatesEditState extends State { }, ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("rate.edit.title")), + title: Text(AppTranslations.of(context)!.text("rate.edit.title")), ), body: Container( padding: EdgeInsets.all(18), diff --git a/lib/pages/receiving/receiving_editor.dart b/lib/pages/receiving/receiving_editor.dart index b8ccc7a..a120ee0 100644 --- a/lib/pages/receiving/receiving_editor.dart +++ b/lib/pages/receiving/receiving_editor.dart @@ -14,14 +14,14 @@ import 'package:fcs/pages/widgets/multi_img_file.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; typedef void FindCallBack(); class ReceivingEditor extends StatefulWidget { - final Package package; + final Package? package; const ReceivingEditor({this.package}); @override _ReceivingEditorState createState() => _ReceivingEditorState(); @@ -30,8 +30,8 @@ class ReceivingEditor extends StatefulWidget { class _ReceivingEditorState extends State { Package package = Package(); bool _isLoading = false; - bool _isNew; - User user; + late bool _isNew; + User? user; TextEditingController _trackingIDCtl = new TextEditingController(); TextEditingController _remarkCtl = new TextEditingController(); MultiImgController _multiImgController = MultiImgController(); @@ -41,9 +41,9 @@ class _ReceivingEditorState extends State { super.initState(); _isNew = widget.package == null; if (!_isNew) { - package = widget.package; - _trackingIDCtl.text = package.trackingID; - _remarkCtl.text = package.remark; + package = widget.package!; + _trackingIDCtl.text = package.trackingID!; + _remarkCtl.text = package.remark!; _multiImgController.setImageUrls = package.photoUrls; user = User( fcsID: package.fcsID, @@ -71,7 +71,7 @@ class _ReceivingEditorState extends State { children: [ Expanded( child: DisplayText( - text: user != null ? user.fcsID : "", + text: user != null ? user!.fcsID : "", labelTextKey: "receiving.fcs.id", icon: FcsIDIcon(), )), @@ -124,7 +124,7 @@ class _ReceivingEditorState extends State { title: "Receiving", ); final namebox = DisplayText( - text: user != null ? user.name : "", + text: user != null ? user!.name : "", labelTextKey: "receiving.consignee.name", iconData: Icons.person, ); @@ -199,20 +199,20 @@ class _ReceivingEditorState extends State { } _scan() async { - PermissionStatus permission = - await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); - if (permission != PermissionStatus.granted) { - Map permissions = - await PermissionHandler() - .requestPermissions([PermissionGroup.camera]); - if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { - showMsgDialog(context, "Error", "Camera permission is not granted"); - return null; - } - } + // PermissionStatus permission = + // await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); + // if (permission != PermissionStatus.granted) { + // Map permissions = + // await PermissionHandler() + // .requestPermissions([PermissionGroup.camera]); + // if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { + // showMsgDialog(context, "Error", "Camera permission is not granted"); + // return null; + // } + // } try { - String barcode = await scanBarcode(); + String? barcode = await scanBarcode(); if (barcode != null) { setState(() { _trackingIDCtl.text = barcode; @@ -239,12 +239,12 @@ class _ReceivingEditorState extends State { try { if (_isNew) { await packageModel.createReceiving( - user, _p, _multiImgController.getAddedFile); + user!, _p, _multiImgController.getAddedFile); } else { - _p.id = widget.package.id; + _p.id = widget.package!.id; _p.photoUrls = package.photoUrls; await packageModel.updateReceiving( - user, + user!, _p, _multiImgController.getAddedFile, _multiImgController.getDeletedUrl); @@ -269,9 +269,9 @@ class _ReceivingEditorState extends State { var _package = Package( trackingID: _trackingIDCtl.text, remark: _remarkCtl.text, - fcsID: user.fcsID, - photoUrls: widget.package.photoUrls); - return widget.package.isChangedForEdit(_package) || + fcsID: user!.fcsID, + photoUrls: widget.package!.photoUrls); + return widget.package!.isChangedForEdit(_package) || _multiImgController.getAddedFile.isNotEmpty || _multiImgController.getDeletedUrl.isNotEmpty; } diff --git a/lib/pages/receiving/receiving_info.dart b/lib/pages/receiving/receiving_info.dart index ff5c12a..d029bf8 100644 --- a/lib/pages/receiving/receiving_info.dart +++ b/lib/pages/receiving/receiving_info.dart @@ -13,7 +13,7 @@ import 'package:fcs/pages/widgets/progress.dart'; import 'package:fcs/pages/widgets/status_tree.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -22,7 +22,7 @@ import 'receiving_editor.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); class ReceivingInfo extends StatefulWidget { - final Package package; + final Package? package; ReceivingInfo({this.package}); @override @@ -30,14 +30,14 @@ class ReceivingInfo extends StatefulWidget { } class _ReceivingInfoState extends State { - Package _package; + Package? _package; bool _isLoading = false; MultiImgController multiImgController = MultiImgController(); @override void initState() { super.initState(); - initPackage(widget.package); + initPackage(widget.package!); } initPackage(Package package) { @@ -57,22 +57,22 @@ class _ReceivingInfoState extends State { bool isCustomer = Provider.of(context).isCustomer(); final trackingIdBox = DisplayText( - text: _package.trackingID, + text: _package!.trackingID, labelTextKey: "package.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); var fcsIDBox = DisplayText( - text: _package.fcsID, + text: _package!.fcsID, labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), ); final customerNameBox = DisplayText( - text: _package.userName, + text: _package!.userName, labelTextKey: "package.create.name", iconData: Icons.perm_identity, ); final remarkBox = DisplayText( - text: _package.remark ?? "-", + text: _package!.remark ?? "-", labelTextKey: "package.edit.remark", iconData: Entypo.new_message, ); @@ -123,10 +123,10 @@ class _ReceivingInfoState extends State { fcsIDBox, customerNameBox, remarkBox, - _package.photoUrls.length == 0 ? Container() : img, + _package!.photoUrls.length == 0 ? Container() : img, StatusTree( - shipmentHistory: _package.shipmentHistory, - currentStatus: _package.status), + shipmentHistory: _package!.shipmentHistory, + currentStatus: _package!.status), SizedBox( height: 20, ) @@ -149,8 +149,8 @@ class _ReceivingInfoState extends State { ); PackageModel packageModel = Provider.of(context, listen: false); - var pkg = await packageModel.getPackage(widget.package.id); - initPackage(pkg); + var pkg = await packageModel.getPackage(widget.package!.id!); + initPackage(pkg!); } _delete() { @@ -164,7 +164,7 @@ class _ReceivingInfoState extends State { try { PackageModel packageModel = Provider.of(context, listen: false); - await packageModel.deleteReceiving(_package); + await packageModel.deleteReceiving(_package!); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/receiving/receiving_list.dart b/lib/pages/receiving/receiving_list.dart index d8e9777..8f23bbb 100644 --- a/lib/pages/receiving/receiving_list.dart +++ b/lib/pages/receiving/receiving_list.dart @@ -94,7 +94,7 @@ class _ReceivingListState extends State { _searchCallback(Package package) async { var packageModel = Provider.of(context, listen: false); - Package _package = await packageModel.getPackage(package.id); + Package? _package = await packageModel.getPackage(package.id!); if (_package == null) return; Navigator.push( context, diff --git a/lib/pages/receiving/receiving_list_row.dart b/lib/pages/receiving/receiving_list_row.dart index d7a4393..95430de 100644 --- a/lib/pages/receiving/receiving_list_row.dart +++ b/lib/pages/receiving/receiving_list_row.dart @@ -3,7 +3,7 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'receiving_info.dart'; @@ -11,12 +11,12 @@ import 'receiving_info.dart'; typedef CallbackPackageSelect(Package package); class ReceivingListRow extends StatelessWidget { - final Package package; - final CallbackPackageSelect callbackPackageSelect; + final Package? package; + final CallbackPackageSelect? callbackPackageSelect; final double dotSize = 15.0; final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); - ReceivingListRow({Key key, this.package, this.callbackPackageSelect}) + ReceivingListRow({Key? key, this.package, this.callbackPackageSelect}) : super(key: key); @override @@ -24,7 +24,7 @@ class ReceivingListRow extends StatelessWidget { return InkWell( onTap: () { if (callbackPackageSelect != null) { - callbackPackageSelect(package); + callbackPackageSelect!(package!); return; } Navigator.push( @@ -55,7 +55,7 @@ class ReceivingListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.id == null ? '' : package.trackingID, + package!.id == null ? '' : package!.trackingID!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -63,7 +63,7 @@ class ReceivingListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - package.market == null ? '' : package.market, + package!.market == null ? '' : package!.market!, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -79,12 +79,14 @@ class ReceivingListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(3.0), - child: getStatus(package.status), + child: getStatus(package!.status??""), ), Padding( padding: const EdgeInsets.all(0), child: new Text( - dateFormat.format(package.currentStatusDate), + package!.currentStatusDate != null + ? dateFormat.format(package!.currentStatusDate!) + : '', style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), ), diff --git a/lib/pages/shipment/box_row.dart b/lib/pages/shipment/box_row.dart index 5b41300..7e9d589 100644 --- a/lib/pages/shipment/box_row.dart +++ b/lib/pages/shipment/box_row.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; class BoxRow extends StatelessWidget { final Carton box; - const BoxRow({Key key, this.box}) : super(key: key); + const BoxRow({Key? key, required this.box}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/pages/shipment/model/shipment_model.dart b/lib/pages/shipment/model/shipment_model.dart index b78c4bb..0dd8c56 100644 --- a/lib/pages/shipment/model/shipment_model.dart +++ b/lib/pages/shipment/model/shipment_model.dart @@ -11,7 +11,7 @@ import 'package:logging/logging.dart'; class ShipmentModel extends BaseModel { final log = Logger('ShipmentModel'); - StreamSubscription listener; + StreamSubscription? listener; List get shipments => _menuSelectedIndex == 1 ? _shipments @@ -19,7 +19,7 @@ class ShipmentModel extends BaseModel { List _shipments = []; - Paginator _delivered; + late Paginator _delivered; bool isLoading = false; int _menuSelectedIndex = 1; @@ -28,7 +28,7 @@ class ShipmentModel extends BaseModel { notifyListeners(); } - get menuSelectedIndex => _menuSelectedIndex; + int get menuSelectedIndex => _menuSelectedIndex; initData(bool forCustomer, {bool myPickup = false}) { logout(); @@ -43,11 +43,11 @@ class ShipmentModel extends BaseModel { @override logout() async { if (_delivered != null) _delivered.close(); - if (listener != null) await listener.cancel(); + if (listener != null) await listener!.cancel(); _shipments = []; } - Future loadMore({bool isCustomer}) async { + Future loadMore({bool? isCustomer}) async { if (menuSelectedIndex == 1) return; // when delivered menu is not selected return if (_delivered.ended) return; @@ -59,7 +59,7 @@ class ShipmentModel extends BaseModel { }); } - Future refresh({bool isCustomer}) async { + Future refresh({bool? isCustomer}) async { if (menuSelectedIndex == 1) return; // when delivered menu is not selected return await _delivered.refresh(onFinished: () { @@ -70,16 +70,16 @@ class ShipmentModel extends BaseModel { Paginator _getDelivered(bool isCustomer) { if (!isCustomer) { if (user == null || - !((user.hasPackages() || - user.hasReceiving() || - user.hasProcessing()))) throw "No privilege"; + !((user!.hasPackages() || + user!.hasReceiving() || + user!.hasProcessing()))) throw "No privilege"; } - var pageQuery = Firestore.instance + var pageQuery = FirebaseFirestore.instance .collection("/$shipments_collection") .where("is_delivered", isEqualTo: true) .where("is_deleted", isEqualTo: false); if (isCustomer) { - pageQuery = pageQuery.where("user_id", isEqualTo: user.id); + pageQuery = pageQuery.where("user_id", isEqualTo: user!.id); } pageQuery = pageQuery.orderBy("status_date", descending: true); var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) { @@ -90,30 +90,31 @@ class ShipmentModel extends BaseModel { Future _loadShipments(bool forCustomer, bool myPickup) async { if (user == null) return; - if (!forCustomer && !user.hasShipment()) return; - if (listener != null) listener.cancel(); + if (!forCustomer && !user!.hasShipment()) return; + if (listener != null) listener!.cancel(); _shipments = []; try { - var q = Firestore.instance + var q = FirebaseFirestore.instance .collection("$shipments_collection") .where("is_delivered", isEqualTo: false) .where("is_canceled", isEqualTo: false) .where("is_deleted", isEqualTo: false); if (forCustomer) { - q = q.where("user_id", isEqualTo: user.id); + q = q.where("user_id", isEqualTo: user!.id); } if (myPickup) { - q = q.where("pickup_user_id", isEqualTo: user.id); + q = q.where("pickup_user_id", isEqualTo: user!.id); } q = q.orderBy("created_at", descending: true); listener = q.snapshots().listen((QuerySnapshot snapshot) { _shipments.clear(); - _shipments = snapshot.documents.map((documentSnapshot) { + _shipments = snapshot.docs.map((documentSnapshot) { var s = Shipment.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, + documentSnapshot.id); return s; }).toList(); notifyListeners(); @@ -130,18 +131,17 @@ class ShipmentModel extends BaseModel { shipment_courier_dropoff ]; - Shipment getActiveShipment(String shipmentID) { - return _shipments?.firstWhere((e) => e.id == shipmentID, - orElse: () => null); + Shipment? getActiveShipment(String shipmentID) { + return _shipments.firstWhere((e) => e.id == shipmentID); } - Future getShipment(String shipmentID) async { + Future getShipment(String shipmentID) async { String path = "/$shipments_collection"; try { - var ref = Firestore.instance.collection("$path").document(shipmentID); - var snap = await ref.get(source: Source.server); + var ref = FirebaseFirestore.instance.collection("$path").doc(shipmentID); + var snap = await ref.get(const GetOptions(source: Source.server)); if (snap.exists) { - var s = Shipment.fromMap(snap.data, snap.documentID); + var s = Shipment.fromMap(snap.data as Map, snap.id); return s; } } catch (e) { @@ -150,20 +150,20 @@ class ShipmentModel extends BaseModel { return null; } - Future> getShipmentWithHandlingFee( + Future?> getShipmentWithHandlingFee( String fcsShipmentID, String userID) async { String path = "/$shipments_collection"; try { - var q = Firestore.instance + var q = FirebaseFirestore.instance .collection("$path") .where("user_id", isEqualTo: userID) .where("is_deleted", isEqualTo: false) .where("handling_fee", isGreaterThan: 0) .where("fcs_shipment_id", isEqualTo: fcsShipmentID); - var snaps = await q.getDocuments(source: Source.server); - List shipments = snaps.documents.map((snap) { + var snaps = await q.get(const GetOptions(source: Source.server)); + List shipments = snaps.docs.map((snap) { if (snap.exists) { - var s = Shipment.fromMap(snap.data, snap.documentID); + var s = Shipment.fromMap(snap.data as Map, snap.id); return s; } }).toList(); diff --git a/lib/pages/shipment/shipment_assign.dart b/lib/pages/shipment/shipment_assign.dart index 5d160b2..ad2e808 100644 --- a/lib/pages/shipment/shipment_assign.dart +++ b/lib/pages/shipment/shipment_assign.dart @@ -14,14 +14,14 @@ import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'widgets.dart'; class ShipmentAssign extends StatefulWidget { - final Shipment shipment; + final Shipment? shipment; ShipmentAssign({this.shipment}); @override @@ -38,13 +38,13 @@ class _ShipmentAssignState extends State { TextEditingController _pickupDate = new TextEditingController(); TextEditingController _handlingFee = new TextEditingController(); - Shipment _shipment; + Shipment? _shipment; bool _isLoading = false; var now = new DateTime.now(); - String _selectedShipmentType; - User _user; - List _users; + String? _selectedShipmentType; + User? _user; + List? _users; @override void initState() { @@ -53,18 +53,19 @@ class _ShipmentAssignState extends State { _shipment = widget.shipment; _loadUsers(); - _selectedShipmentType = _shipment.shipmentType; - _fromTimeEditingController.text = _shipment.pickupTimeStart; - _toTimeEditingController.text = _shipment.pickupTimeEnd; - _pickupDate.text = dateFormatter.format(_shipment.pickupDate ?? now); - _handlingFee.text = _shipment.handlingFee?.toString() ?? "0"; + _selectedShipmentType = _shipment!.shipmentType; + _fromTimeEditingController.text = _shipment!.pickupTimeStart!; + _toTimeEditingController.text = _shipment!.pickupTimeEnd!; + _pickupDate.text = dateFormatter.format(_shipment!.pickupDate ?? now); + _handlingFee.text = _shipment!.handlingFee != null + ? _shipment!.handlingFee.toString() + : "0"; } _loadUsers() async { StaffModel staffModel = Provider.of(context, listen: false); var users = await staffModel.getPickupEmployees(); - var selectUser = users.firstWhere((e) => e.id == _shipment.pickupUserID, - orElse: () => null); + var selectUser = users.firstWhere((e) => e.id == _shipment!.pickupUserID); setState(() { _users = users; _user = selectUser; @@ -74,7 +75,7 @@ class _ShipmentAssignState extends State { @override Widget build(BuildContext context) { ShipmentModel pickupModel = Provider.of(context); - final shipmentNumberBox = getShipmentNumberStatus(context, _shipment); + final shipmentNumberBox = getShipmentNumberStatus(context, _shipment!); bool isLocalPickup = _selectedShipmentType == shipment_local_pickup; bool isCourierPickup = _selectedShipmentType == shipment_courier_pickup; bool isLocalDropoff = _selectedShipmentType == shipment_local_dropoff; @@ -146,15 +147,15 @@ class _ShipmentAssignState extends State { } _save() async { - _shipment.pickupUserID = this._user.id; - _shipment.handlingFee = double.tryParse(_handlingFee.text) ?? 0; + _shipment!.pickupUserID = this._user!.id; + _shipment!.handlingFee = double.tryParse(_handlingFee.text) ?? 0; setState(() { _isLoading = true; }); try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.assignShipment(_shipment); + await shipmentModel.assignShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/shipment/shipment_box_editor.dart b/lib/pages/shipment/shipment_box_editor.dart index c04338d..1fd3778 100644 --- a/lib/pages/shipment/shipment_box_editor.dart +++ b/lib/pages/shipment/shipment_box_editor.dart @@ -17,11 +17,12 @@ import 'package:fcs/pages/widgets/my_data_table.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; + import 'package:provider/provider.dart'; class ShipmentBoxEditor extends StatefulWidget { - final Carton box; + final Carton? box; ShipmentBoxEditor({this.box}); @override @@ -33,9 +34,9 @@ class _ShipmentBoxEditorState extends State { TextEditingController _widthCtl = new TextEditingController(); TextEditingController _heightCtl = new TextEditingController(); - Carton _box; + Carton? _box; bool _isLoading = false; - bool _isNew; + late bool _isNew; double volumetricRatio = 0; double shipmentWeight = 0; @@ -50,16 +51,16 @@ class _ShipmentBoxEditorState extends State { if (widget.box != null) { _box = widget.box; _isNew = false; - _lengthCtl.text = _box.length.toString(); - _widthCtl.text = _box.width.toString(); - _heightCtl.text = _box.height.toString(); + _lengthCtl.text = _box!.length != null ? _box!.length.toString() : ''; + _widthCtl.text = _box!.width != null ? _box!.width.toString() : ''; + _heightCtl.text = _box!.height != null ? _box!.height.toString() : ''; } else { var shipmentModel = Provider.of(context, listen: false); _isNew = true; _box = Carton(cargoTypes: []); - _box.deliveryAddress = shipmentModel.defalutAddress; + _box!.deliveryAddress = shipmentModel.defalutAddress; _lengthCtl.text = "12"; _widthCtl.text = "12"; @@ -151,10 +152,11 @@ class _ShipmentBoxEditorState extends State { color: primaryColor, ), onPressed: () async { - CargoType cargo = await Navigator.push( + CargoType? cargo = await Navigator.push( context, CupertinoPageRoute( builder: (context) => CargoTypeEditor())); + if (cargo == null) return; _addCargo(cargo); }), ), @@ -186,19 +188,19 @@ class _ShipmentBoxEditorState extends State { shipmentWeightBox, LocalTitle(textKey: "shipment.box.delivery"), DefaultDeliveryAddress( - deliveryAddress: _box.deliveryAddress, + deliveryAddress: _box!.deliveryAddress, labelKey: "shipment.box.delivery", onTap: () async { - DeliveryAddress d = await Navigator.push( + DeliveryAddress? d = await Navigator.push( context, CupertinoPageRoute( builder: (context) => DeliveryAddressSelection( - deliveryAddress: _box.deliveryAddress, + deliveryAddress: _box!.deliveryAddress, user: mainModel.user)), ); if (d == null) return; setState(() { - _box.deliveryAddress = d; + _box!.deliveryAddress = d; }); }), createBtn @@ -210,25 +212,26 @@ class _ShipmentBoxEditorState extends State { } List getCargoRows(BuildContext context) { - if (_box.cargoTypes == null) { + if (_box!.cargoTypes == null) { return []; } double total = 0; - var rows = _box.cargoTypes.map((c) { + var rows = _box!.cargoTypes.map((c) { total += c.weight; return MyDataRow( onSelectChanged: (bool selected) async { - CargoType cargo = await Navigator.push( + CargoType? cargo = await Navigator.push( context, CupertinoPageRoute( builder: (context) => CargoTypeEditor( cargo: c, ))); + if (cargo == null) return; _addCargo(cargo); }, cells: [ MyDataCell(new Text( - c.name == null ? "" : c.name, + c.name == null ? "" : c.name!, style: textStyle, )), MyDataCell( @@ -281,14 +284,14 @@ class _ShipmentBoxEditorState extends State { _addCargo(CargoType cargo) { if (cargo == null) return; setState(() { - _box.cargoTypes.remove(cargo); - _box.cargoTypes.add(cargo); + _box!.cargoTypes.remove(cargo); + _box!.cargoTypes.add(cargo); }); } _removeCargo(CargoType cargo) { setState(() { - _box.cargoTypes.remove(cargo); + _box!.cargoTypes.remove(cargo); }); } @@ -296,9 +299,9 @@ class _ShipmentBoxEditorState extends State { double l = double.parse(_lengthCtl.text, (s) => 0); double w = double.parse(_widthCtl.text, (s) => 0); double h = double.parse(_heightCtl.text, (s) => 0); - _box.length = l; - _box.width = w; - _box.height = h; + _box!.length = l; + _box!.width = w; + _box!.height = h; Navigator.pop(context, _box); } } diff --git a/lib/pages/shipment/shipment_confirm.dart b/lib/pages/shipment/shipment_confirm.dart index 5017eed..05ed394 100644 --- a/lib/pages/shipment/shipment_confirm.dart +++ b/lib/pages/shipment/shipment_confirm.dart @@ -8,14 +8,15 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'widgets.dart'; class ShipmentConfirm extends StatefulWidget { - final Shipment shipment; + final Shipment? shipment; ShipmentConfirm({this.shipment}); @override @@ -27,7 +28,7 @@ class _ShipmentConfirmState extends State { var timeFormatter = new DateFormat('jm'); TextEditingController _handlingFee = new TextEditingController(); - Shipment _shipment; + Shipment? _shipment; bool _isLoading = false; var now = new DateTime.now(); @@ -36,17 +37,17 @@ class _ShipmentConfirmState extends State { super.initState(); _shipment = widget.shipment; - _handlingFee.text = _shipment.handlingFee?.toString() ?? "0"; + _handlingFee.text = _shipment!.handlingFee.toString(); } @override Widget build(BuildContext context) { - final shipmentNumberBox = getShipmentNumberStatus(context, _shipment); + final shipmentNumberBox = getShipmentNumberStatus(context, _shipment!); final handlingFeeBox = InputText( labelTextKey: "shipment.handling.fee", controller: _handlingFee, - iconData: FontAwesome.truck, + iconData: FontAwesomeIcons.truck, ); final confirmbtn = LocalButton( textKey: "shipment.confirm.btn", @@ -94,14 +95,14 @@ class _ShipmentConfirmState extends State { } _save() async { - _shipment.handlingFee = double.tryParse(_handlingFee.text) ?? 0; + _shipment!.handlingFee = double.tryParse(_handlingFee.text) ?? 0; setState(() { _isLoading = true; }); try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.confirmShipment(_shipment); + await shipmentModel.confirmShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/shipment/shipment_editor.dart b/lib/pages/shipment/shipment_editor.dart index 6ea4f81..8dda866 100644 --- a/lib/pages/shipment/shipment_editor.dart +++ b/lib/pages/shipment/shipment_editor.dart @@ -29,7 +29,7 @@ import 'shipment_box_editor.dart'; import 'widgets.dart'; class ShipmentEditor extends StatefulWidget { - final Shipment shipment; + final Shipment? shipment; ShipmentEditor({this.shipment}); @override @@ -45,12 +45,12 @@ class _ShipmentEditorState extends State { TextEditingController _toTimeEditingController = new TextEditingController(); TextEditingController _pickupDate = new TextEditingController(); - Shipment _shipment; + Shipment? _shipment; bool _isLoading = false; var now = new DateTime.now(); - bool _isNew; + late bool _isNew; - String _selectedShipmentType; + String? _selectedShipmentType; @override void initState() { @@ -59,20 +59,21 @@ class _ShipmentEditorState extends State { if (widget.shipment != null) { _isNew = false; _shipment = widget.shipment; - _selectedShipmentType = _shipment.shipmentType; - _fromTimeEditingController.text = _shipment.pickupTimeStart; - _toTimeEditingController.text = _shipment.pickupTimeEnd; - _pickupDate.text = dateFormatter.format(_shipment.pickupDate ?? now); + _selectedShipmentType = _shipment!.shipmentType; + _fromTimeEditingController.text = _shipment!.pickupTimeStart ?? ""; + _toTimeEditingController.text = _shipment!.pickupTimeEnd ?? ""; + _pickupDate.text = dateFormatter.format(_shipment!.pickupDate ?? now); } else { _isNew = true; _selectedShipmentType = shipment_local_pickup; _pickupDate.text = dateFormatter.format(now); _fromTimeEditingController.text = "${timeFormatter.format(now)}"; _toTimeEditingController.text = "${timeFormatter.format(now)}"; - _shipment = Shipment(boxes: []); + // _shipment = Shipment(boxes: []); var shipmentModel = Provider.of(context, listen: false); - _shipment.pickupAddress = shipmentModel.defalutAddress; + _shipment!.pickupAddress = shipmentModel.defalutAddress; + _shipment!.boxes = []; _pickupDate.text = dateFormatter.format(now); } } @@ -86,7 +87,7 @@ class _ShipmentEditorState extends State { Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); ShipmentModel pickupModel = Provider.of(context); - final shipmentNumberBox = getShipmentNumberStatus(context, _shipment); + final shipmentNumberBox = getShipmentNumberStatus(context, _shipment!); bool isLocalPickup = _selectedShipmentType == shipment_local_pickup; bool isCourierPickup = _selectedShipmentType == shipment_courier_pickup; bool isLocalDropoff = _selectedShipmentType == shipment_local_dropoff; @@ -121,20 +122,20 @@ class _ShipmentEditorState extends State { backgroundColor: Colors.white, )); final pickupAddressBox = DefaultDeliveryAddress( - deliveryAddress: _shipment.pickupAddress, + deliveryAddress: _shipment!.pickupAddress, iconData: Icons.location_on, labelKey: "shipment.location", onTap: () async { - DeliveryAddress address = await Navigator.push( + DeliveryAddress? address = await Navigator.push( context, CupertinoPageRoute( builder: (context) => DeliveryAddressSelection( - deliveryAddress: _shipment.pickupAddress, + deliveryAddress: _shipment!.pickupAddress, user: mainModel.user)), ); if (address == null) return; setState(() { - _shipment.pickupAddress = address; + _shipment!.pickupAddress = address; }); }, ); @@ -142,7 +143,7 @@ class _ShipmentEditorState extends State { FcsIDIcon(), Expanded( child: DisplayText( - text: mainModel.setting.usaAddress, + text: mainModel.setting!.usaAddress, ), ) ]); @@ -194,7 +195,7 @@ class _ShipmentEditorState extends State { LocalRadioButtons( values: pickupModel.shipmentTypes, selectedValue: _selectedShipmentType, - callback: (v) { + callback: (String? v) { setState(() { _selectedShipmentType = v; }); @@ -239,7 +240,7 @@ class _ShipmentEditorState extends State { ), ), Column( - children: getBoxList(context, _shipment.boxes), + children: getBoxList(context, _shipment!.boxes), ), _isNew ? createBtn : updateBtn, ], @@ -276,7 +277,7 @@ class _ShipmentEditorState extends State { _addBox(Carton box) { if (box == null) return; box.cartonType = carton_from_shipments; - _shipment.boxes.add(box); + _shipment!.boxes.add(box); setState(() {}); } @@ -287,15 +288,15 @@ class _ShipmentEditorState extends State { _removeBox(Carton box) { if (box == null) return; - _shipment.boxes.remove(box); + _shipment!.boxes.remove(box); setState(() {}); } _save() async { - _shipment.shipmentType = this._selectedShipmentType; - _shipment.pickupDate = dateFormatter.parse(_pickupDate.text); - _shipment.pickupTimeStart = _fromTimeEditingController.text; - _shipment.pickupTimeEnd = _toTimeEditingController.text; + _shipment!.shipmentType = this._selectedShipmentType; + _shipment!.pickupDate = dateFormatter.parse(_pickupDate.text); + _shipment!.pickupTimeStart = _fromTimeEditingController.text; + _shipment!.pickupTimeEnd = _toTimeEditingController.text; setState(() { _isLoading = true; }); @@ -303,9 +304,9 @@ class _ShipmentEditorState extends State { ShipmentModel shipmentModel = Provider.of(context, listen: false); if (_isNew) { - await shipmentModel.createShipment(_shipment); + await shipmentModel.createShipment(_shipment!); } else { - await shipmentModel.updateShipment(_shipment); + await shipmentModel.updateShipment(_shipment!); } Navigator.pop(context, true); } catch (e) { @@ -319,10 +320,10 @@ class _ShipmentEditorState extends State { _openCourierWebsite() { MainModel mainModel = Provider.of(context, listen: false); - launch("${mainModel.setting.courierWebsite}"); + launch("${mainModel.setting!.courierWebsite}"); } isDataChanged() { - return _shipment.boxes.isNotEmpty; + return _shipment!.boxes.isNotEmpty; } } diff --git a/lib/pages/shipment/shipment_info.dart b/lib/pages/shipment/shipment_info.dart index 0b011bc..ee29ad5 100644 --- a/lib/pages/shipment/shipment_info.dart +++ b/lib/pages/shipment/shipment_info.dart @@ -20,7 +20,7 @@ import 'package:fcs/pages/widgets/multi_img_controller.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -32,8 +32,8 @@ import 'shipment_editor.dart'; import 'widgets.dart'; class ShipmentInfo extends StatefulWidget { - final bool isCustomer; - final Shipment shipment; + final bool? isCustomer; + final Shipment? shipment; ShipmentInfo({this.shipment, this.isCustomer}); @override @@ -62,39 +62,42 @@ class _ShipmentInfoState extends State { TextEditingController _pickupDate = new TextEditingController(); TextEditingController _handlingFeeController = new TextEditingController(); - Shipment _shipment; + Shipment? _shipment; bool _isLoading = false; - bool _isCustomer; + late bool _isCustomer; var now = new DateTime.now(); @override void initState() { super.initState(); _shipment = widget.shipment; - _isCustomer = widget.isCustomer; - _loadCartons(_shipment.id); + _isCustomer = widget.isCustomer!; + _loadCartons(_shipment!.id!); - _addressEditingController.text = _shipment.address; - _fromTimeEditingController.text = _shipment.pickupTimeStart; - _toTimeEditingController.text = _shipment.pickupTimeEnd; - _noOfPackageEditingController.text = _shipment.numberOfPackage.toString(); - _weightEditingController.text = _shipment.weight.toString(); - _pickupDate.text = dateFormatter.format(_shipment.pickupDate ?? now); + _addressEditingController.text = _shipment!.address ?? ""; + _fromTimeEditingController.text = _shipment!.pickupTimeStart ?? ""; + _toTimeEditingController.text = _shipment!.pickupTimeEnd ?? ""; + _noOfPackageEditingController.text = _shipment!.numberOfPackage != null + ? _shipment!.numberOfPackage.toString() + : ""; + _weightEditingController.text = + _shipment!.weight != null ? _shipment!.weight.toString() : ""; + _pickupDate.text = dateFormatter.format(_shipment!.pickupDate ?? now); } _loadCartons(String shipmentID) async { CartonModel cartonModel = Provider.of(context, listen: false); var cartons = await cartonModel.getCartons(shipmentID); setState(() { - _shipment.boxes = cartons; + _shipment!.boxes = cartons; }); } _loadShipment(String id) async { ShipmentModel shipmentModel = Provider.of(context, listen: false); - Shipment s = await shipmentModel.getShipment(id); - s.boxes = _shipment.boxes; + Shipment? s = await shipmentModel.getShipment(id); + s!.boxes = _shipment!.boxes; setState(() { _shipment = s; }); @@ -109,31 +112,34 @@ class _ShipmentInfoState extends State { Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); ShipmentModel pickupModel = Provider.of(context); - bool isLocalPickup = _shipment.shipmentType == shipment_local_pickup; - bool isCourierPickup = _shipment.shipmentType == shipment_courier_pickup; - bool isLocalDropoff = _shipment.shipmentType == shipment_local_dropoff; - bool isCourierDropoff = _shipment.shipmentType == shipment_courier_dropoff; - bool isEditable = widget.isCustomer - ? (_shipment.isPending || _shipment.isAssigned) - : (_shipment.isPending || _shipment.isAssigned || _shipment.isPickuped); + bool isLocalPickup = _shipment!.shipmentType == shipment_local_pickup; + bool isCourierPickup = _shipment!.shipmentType == shipment_courier_pickup; + bool isLocalDropoff = _shipment!.shipmentType == shipment_local_dropoff; + bool isCourierDropoff = _shipment!.shipmentType == shipment_courier_dropoff; + bool isEditable = widget.isCustomer! + ? (_shipment!.isPending || _shipment!.isAssigned) + : (_shipment!.isPending || + _shipment!.isAssigned || + _shipment!.isPickuped); bool canCancel = - _shipment.isPending || _shipment.isConfirmed || _shipment.isAssigned; + _shipment!.isPending || _shipment!.isConfirmed || _shipment!.isAssigned; final popupMenu = LocalPopupMenuButton( popmenus: [ LocalPopupMenu( - enabled: _shipment.isPending && isLocalPickup, + enabled: _shipment!.isPending && isLocalPickup, id: 1, textKey: "shipment.assign.for.pickup", ), LocalPopupMenu( enabled: - (_shipment.isPickuped && isLocalPickup) || _shipment.isReceived, + (_shipment!.isPickuped && isLocalPickup) || _shipment!.isReceived, id: 3, textKey: "shipment.pack.menuitem", ), LocalPopupMenu( - enabled: _shipment.isPending && (isCourierPickup || isCourierDropoff), + enabled: + _shipment!.isPending && (isCourierPickup || isCourierDropoff), id: 4, textKey: "shipment.confirm.menuitem", ), @@ -149,7 +155,11 @@ class _ShipmentInfoState extends State { ? _gotoAssign() : p.id == 2 ? _cancel() - : p.id == 3 ? _gotoPack() : p.id == 4 ? _gotoConfirm() : null, + : p.id == 3 + ? _gotoPack() + : p.id == 4 + ? _gotoConfirm() + : null, ); final popupMenuCustomer = LocalPopupMenuButton( popmenus: [ @@ -163,29 +173,31 @@ class _ShipmentInfoState extends State { buttonIcon: Icons.more_vert, popupMenuCallback: (p) => p.id == 2 ? _cancel() : null, ); - final shipmentNumberBox = getShipmentNumberStatus(context, _shipment); + final shipmentNumberBox = getShipmentNumberStatus(context, _shipment!); final fromTimeBox = DisplayText( labelTextKey: 'shipment.from', iconData: Icons.timer, - text: _shipment.pickupTimeStart, + text: _shipment!.pickupTimeStart ?? "", ); final toTimeBox = DisplayText( labelTextKey: 'shipment.to', iconData: Icons.timer_off, - text: _shipment.pickupTimeEnd, + text: _shipment!.pickupTimeEnd ?? "", ); final pickupDateBox = DisplayText( labelTextKey: "shipment.date", iconData: Icons.date_range, - text: dateFormatter.format(_shipment.pickupDate), + text: _shipment!.pickupDate != null + ? dateFormatter.format(_shipment!.pickupDate!) + : '', ); var localDropoffAddressBox = Row(children: [ FcsIDIcon(), Expanded( child: DisplayText( - text: mainModel.setting.usaAddress, + text: mainModel.setting!.usaAddress ?? "", ), ) ]); @@ -201,17 +213,17 @@ class _ShipmentInfoState extends State { backgroundColor: Colors.white, )); final pickupAddressBox = DefaultDeliveryAddress( - deliveryAddress: _shipment.pickupAddress, + deliveryAddress: _shipment!.pickupAddress, iconData: Icons.location_on, labelKey: "shipment.location", ); var usersBox = DisplayText( labelTextKey: "shipment.staff", - text: _shipment.pickupUserName, + text: _shipment!.pickupUserName ?? "", iconData: MaterialCommunityIcons.worker); var handlingFeeBox = DisplayText( labelTextKey: "shipment.handling.fee", - text: (_shipment.handlingFee ?? 0).toString(), + text: (_shipment!.handlingFee).toString(), iconData: FontAwesome.truck); final assignCompleteBtn = LocalButton( @@ -232,7 +244,7 @@ class _ShipmentInfoState extends State { ); final fcsShipmentNumberBox = DisplayText( - text: _shipment.fcsShipmentNumber, + text: _shipment!.fcsShipmentNumber ?? "", labelTextKey: "FCSshipment.number", iconData: Ionicons.ios_airplane, ); @@ -267,7 +279,7 @@ class _ShipmentInfoState extends State { color: isEditable ? primaryColor : Colors.grey), onPressed: isEditable ? _edit : null, ), - widget.isCustomer ? popupMenuCustomer : popupMenu, + widget.isCustomer! ? popupMenuCustomer : popupMenu, ]), body: Padding( padding: const EdgeInsets.all(10.0), @@ -278,7 +290,7 @@ class _ShipmentInfoState extends State { LocalRadioButtons( readOnly: true, values: pickupModel.shipmentTypes, - selectedValue: _shipment.shipmentType, + selectedValue: _shipment!.shipmentType, ), ...(isLocalDropoff ? [ @@ -305,13 +317,13 @@ class _ShipmentInfoState extends State { LocalTitle( textKey: "boxes.name", trailing: Text( - "${_shipment.totalCount} Cartons - ${_shipment.totalWeight} lb"), + "${_shipment!.totalCount} Cartons - ${_shipment!.totalWeight} lb"), ), Column( - children: getBoxList(context, _shipment.boxes), + children: getBoxList(context, _shipment!.boxes), ), !_isCustomer ? fcsShipmentNumberBox : Container(), - ...(!_shipment.isPending + ...(!_shipment!.isPending ? [ handlingFeeBox, ] @@ -324,22 +336,22 @@ class _ShipmentInfoState extends State { : []), ...(isLocalPickup && !_isCustomer ? [ - _shipment.isPending ? assignCompleteBtn : Container(), - _shipment.isAssigned ? completePickupBtn : Container(), - _shipment.isPickuped ? completePackBtn : Container(), + _shipment!.isPending ? assignCompleteBtn : Container(), + _shipment!.isAssigned ? completePickupBtn : Container(), + _shipment!.isPickuped ? completePackBtn : Container(), ] : []), ...((isCourierPickup || isCourierDropoff) && !_isCustomer ? [ - _shipment.isPending ? confirmCompleteBtn : Container(), - _shipment.isConfirmed ? completeReceiveBtn : Container(), - _shipment.isReceived ? completePackBtn : Container(), + _shipment!.isPending ? confirmCompleteBtn : Container(), + _shipment!.isConfirmed ? completeReceiveBtn : Container(), + _shipment!.isReceived ? completePackBtn : Container(), ] : []), ...((isLocalDropoff) && !_isCustomer ? [ - _shipment.isPending ? completeReceiveBtn : Container(), - _shipment.isReceived ? completePackBtn : Container(), + _shipment!.isPending ? completeReceiveBtn : Container(), + _shipment!.isReceived ? completePackBtn : Container(), ] : []), ], @@ -361,7 +373,7 @@ class _ShipmentInfoState extends State { } _edit() async { - bool updated = await Navigator.push( + bool? updated = await Navigator.push( context, CupertinoPageRoute( builder: (context) => ShipmentEditor( @@ -369,8 +381,8 @@ class _ShipmentInfoState extends State { )), ); if (updated ?? false) { - await _loadShipment(_shipment.id); - await _loadCartons(_shipment.id); + await _loadShipment(_shipment!.id!); + await _loadCartons(_shipment!.id!); } } @@ -387,7 +399,7 @@ class _ShipmentInfoState extends State { try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.cancelShipment(_shipment); + await shipmentModel.cancelShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -400,11 +412,11 @@ class _ShipmentInfoState extends State { _openCourierWebsite() { MainModel mainModel = Provider.of(context, listen: false); - launch("${mainModel.setting.courierWebsite}"); + launch("${mainModel.setting!.courierWebsite}"); } _gotoAssign() async { - bool assigned = await Navigator.push( + bool? assigned = await Navigator.push( context, CupertinoPageRoute( builder: (context) => ShipmentAssign( @@ -412,7 +424,7 @@ class _ShipmentInfoState extends State { )), ); if (assigned ?? false) { - await _loadShipment(_shipment.id); + await _loadShipment(_shipment!.id!); } } @@ -429,7 +441,7 @@ class _ShipmentInfoState extends State { try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.completeAssignShipment(_shipment); + await shipmentModel.completeAssignShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -453,7 +465,7 @@ class _ShipmentInfoState extends State { try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.completePickupShipment(_shipment); + await shipmentModel.completePickupShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -465,16 +477,16 @@ class _ShipmentInfoState extends State { } _gotoPack() async { - bool assigned = await Navigator.push( + bool? assigned = await Navigator.push( context, CupertinoPageRoute( builder: (context) => ShipmentPack( - shipment: _shipment, + shipment: _shipment!, )), ); if (assigned ?? false) { - await _loadShipment(_shipment.id); - await _loadCartons(_shipment.id); + await _loadShipment(_shipment!.id!); + await _loadCartons(_shipment!.id!); } } @@ -491,7 +503,7 @@ class _ShipmentInfoState extends State { try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.completePackShipment(_shipment); + await shipmentModel.completePackShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -503,7 +515,7 @@ class _ShipmentInfoState extends State { } _gotoConfirm() async { - bool assigned = await Navigator.push( + bool? assigned = await Navigator.push( context, CupertinoPageRoute( builder: (context) => ShipmentConfirm( @@ -511,7 +523,7 @@ class _ShipmentInfoState extends State { )), ); if (assigned ?? false) { - await _loadShipment(_shipment.id); + await _loadShipment(_shipment!.id!); } } @@ -528,7 +540,7 @@ class _ShipmentInfoState extends State { try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.completeConfirmShipment(_shipment); + await shipmentModel.completeConfirmShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -552,7 +564,7 @@ class _ShipmentInfoState extends State { try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.completeReceiveShipment(_shipment); + await shipmentModel.completeReceiveShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/shipment/shipment_list.dart b/lib/pages/shipment/shipment_list.dart index 1424639..af047ab 100644 --- a/lib/pages/shipment/shipment_list.dart +++ b/lib/pages/shipment/shipment_list.dart @@ -17,7 +17,7 @@ import 'shipment_list_row.dart'; class ShipmentList extends StatefulWidget { final bool forCustomer; - const ShipmentList({Key key, this.forCustomer = true}) : super(key: key); + const ShipmentList({Key? key, this.forCustomer = true}) : super(key: key); @override _ShipmentListState createState() => _ShipmentListState(); } diff --git a/lib/pages/shipment/shipment_list_row.dart b/lib/pages/shipment/shipment_list_row.dart index d09d086..329e29b 100644 --- a/lib/pages/shipment/shipment_list_row.dart +++ b/lib/pages/shipment/shipment_list_row.dart @@ -2,15 +2,15 @@ import 'package:fcs/domain/entities/shipment.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import '../main/util.dart'; import 'shipment_info.dart'; class ShipmentListRow extends StatelessWidget { - final Shipment shipment; - final bool isCustomer; - const ShipmentListRow({Key key, this.shipment, this.isCustomer}) + final Shipment? shipment; + final bool? isCustomer; + const ShipmentListRow({Key? key, this.shipment, this.isCustomer}) : super(key: key); @override @@ -45,7 +45,7 @@ class ShipmentListRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - shipment.shipmentNumber ?? "", + shipment!.shipmentNumber ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -69,7 +69,7 @@ class ShipmentListRow extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.all(0), - child: getStatus(shipment.status ?? ""), + child: getStatus(shipment!.status ?? ""), ), // Padding( // padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5), diff --git a/lib/pages/shipment/shipment_pack.dart b/lib/pages/shipment/shipment_pack.dart index 245c1ff..affdfad 100644 --- a/lib/pages/shipment/shipment_pack.dart +++ b/lib/pages/shipment/shipment_pack.dart @@ -11,14 +11,14 @@ import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'widgets.dart'; class ShipmentPack extends StatefulWidget { - final Shipment shipment; + final Shipment? shipment; ShipmentPack({this.shipment}); @override @@ -29,12 +29,12 @@ class _ShipmentPackState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); var timeFormatter = new DateFormat('jm'); - Shipment _shipment; + Shipment? _shipment; bool _isLoading = false; var now = new DateTime.now(); - FcsShipment _fcsShipment; - List _fcsShipments; + FcsShipment? _fcsShipment; + List? _fcsShipments; @override void initState() { @@ -48,8 +48,8 @@ class _ShipmentPackState extends State { FcsShipmentModel fcsShipmentModel = Provider.of(context, listen: false); var fcsShipments = await fcsShipmentModel.getActiveFcsShipments(); - var fcsShipment = fcsShipments - .firstWhere((e) => e.id == _shipment.fcsShipmentID, orElse: () => null); + var fcsShipment = + fcsShipments.firstWhere((e) => e.id == _shipment?.fcsShipmentID); setState(() { _fcsShipments = fcsShipments; _fcsShipment = fcsShipment; @@ -58,7 +58,7 @@ class _ShipmentPackState extends State { @override Widget build(BuildContext context) { - final shipmentNumberBox = getShipmentNumberStatus(context, _shipment); + final shipmentNumberBox = getShipmentNumberStatus(context, _shipment!); var fcsShipmentsBox = LocalDropdown( callback: (v) { @@ -120,14 +120,14 @@ class _ShipmentPackState extends State { } _save() async { - _shipment.fcsShipmentID = this._fcsShipment.id; + _shipment!.fcsShipmentID = this._fcsShipment!.id; setState(() { _isLoading = true; }); try { ShipmentModel shipmentModel = Provider.of(context, listen: false); - await shipmentModel.packShipment(_shipment); + await shipmentModel.packShipment(_shipment!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/signin/invitation_request_page.dart b/lib/pages/signin/invitation_request_page.dart index 5e94f6d..8099283 100644 --- a/lib/pages/signin/invitation_request_page.dart +++ b/lib/pages/signin/invitation_request_page.dart @@ -16,7 +16,7 @@ class RequestInvitationPage extends StatefulWidget { class _RequestInvitationPageState extends State { bool _isLoading = false; - TextEditingController nameCtl; + TextEditingController nameCtl = new TextEditingController(); @override void initState() { diff --git a/lib/pages/signin/signin_logic.dart b/lib/pages/signin/signin_logic.dart index bdde97a..b0d788e 100644 --- a/lib/pages/signin/signin_logic.dart +++ b/lib/pages/signin/signin_logic.dart @@ -3,21 +3,20 @@ import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/signin/invitation_request_page.dart'; import 'package:fcs/pages/signin/signup_page.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; navigateAfterAuthVerified(BuildContext context) async { - User user = Provider.of(context, listen: false).user; - Setting setting = Provider.of(context, listen: false).setting; + User? user = Provider.of(context, listen: false).user; + Setting? setting = Provider.of(context, listen: false).setting; if (setting == null) return; if (user != null && (user.joined || user.requested)) { Navigator.pushNamedAndRemoveUntil(context, "/home", (r) => false); } else { - if (setting.inviteRequired) { + if (setting.inviteRequired ?? false) { bool invited = await Provider.of(context, listen: false).hasInvite(); if (!invited) { diff --git a/lib/pages/signin/signin_page.dart b/lib/pages/signin/signin_page.dart index 3e3470d..6eaeca8 100644 --- a/lib/pages/signin/signin_page.dart +++ b/lib/pages/signin/signin_page.dart @@ -3,7 +3,6 @@ import 'package:fcs/domain/entities/auth_result.dart'; import 'package:fcs/domain/entities/auth_status.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/signin/signin_logic.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; @@ -23,9 +22,9 @@ class SigninPage extends StatefulWidget { class _SigninPageState extends State { bool _isLoading = false; - String dialCode; + late String dialCode; - TextEditingController phonenumberCtl; + TextEditingController phonenumberCtl = new TextEditingController(); @override void initState() { @@ -82,7 +81,7 @@ class _SigninPageState extends State { children: [ Container( decoration: BoxDecoration( - border: Border.all(color: Colors.grey[400], width: 1), + border: Border.all(color: Colors.grey.shade400, width: 1), borderRadius: BorderRadius.all(Radius.circular(12.0))), child: CountryCodePicker( onChanged: _countryChange, @@ -152,7 +151,7 @@ class _SigninPageState extends State { _countryChange(CountryCode countryCode) { setState(() { - dialCode = countryCode.dialCode; + dialCode = countryCode.dialCode ?? '+95'; }); } @@ -182,7 +181,7 @@ class _SigninPageState extends State { await navigateAfterAuthVerified(context); } if (auth.authStatus == AuthStatus.ERROR) { - showMsgDialog(context, "Error", auth.authErrorMsg); + showMsgDialog(context, "Error", auth.authErrorMsg ?? ""); } } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/pages/signin/signup_page.dart b/lib/pages/signin/signup_page.dart index 4f96e6e..04a08c8 100644 --- a/lib/pages/signin/signup_page.dart +++ b/lib/pages/signin/signup_page.dart @@ -17,7 +17,7 @@ class SignupPage extends StatefulWidget { class _SignupPageState extends State { bool _isLoading = false; - TextEditingController nameCtl; + TextEditingController nameCtl = new TextEditingController(); @override void initState() { diff --git a/lib/pages/signin/sms_code_page.dart b/lib/pages/signin/sms_code_page.dart index dfe677c..73ef48e 100644 --- a/lib/pages/signin/sms_code_page.dart +++ b/lib/pages/signin/sms_code_page.dart @@ -18,18 +18,19 @@ const resend_count_sec = 30; class SmsCodePage extends StatefulWidget { final String phoneNumber; - const SmsCodePage({Key key, this.phoneNumber}) : super(key: key); + const SmsCodePage({Key? key, required this.phoneNumber}) : super(key: key); @override _SmsCodePageState createState() => _SmsCodePageState(); } class _SmsCodePageState extends State { bool _isLoading = false; - String pin; - bool allNumberEntered; - Timer _timer; - int _start = resend_count_sec; bool canResend = false; + int _start = resend_count_sec; + + late String pin; + late bool allNumberEntered; + late Timer _timer; @override void initState() { @@ -116,7 +117,7 @@ class _SmsCodePageState extends State { pinLength: 6, decoration: BoxLooseDecoration( strokeColorBuilder: PinListenColorBuilder( - primaryColor, Colors.grey[400])), + primaryColor, Colors.grey.shade400)), textInputAction: TextInputAction.done, autoFocus: true, onChanged: _pinChange, @@ -133,13 +134,13 @@ class _SmsCodePageState extends State { child: LocalText(context, 'sms.resend', fontSize: 16, color: - canResend ? primaryColor : Colors.grey[400]), + canResend ? primaryColor : Colors.grey.shade400), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.0), side: BorderSide( color: canResend ? primaryColor - : Colors.grey[400])), + : Colors.grey.shade400)), ), InkWell( onTap: allNumberEntered ? _verify : null, diff --git a/lib/pages/staff/model/staff_model.dart b/lib/pages/staff/model/staff_model.dart index cadb5a4..b2c2ebb 100644 --- a/lib/pages/staff/model/staff_model.dart +++ b/lib/pages/staff/model/staff_model.dart @@ -11,8 +11,8 @@ import 'package:logging/logging.dart'; class StaffModel extends BaseModel { final log = Logger('StaffModel'); - StreamSubscription listener; - StreamSubscription privilegeListener; + StreamSubscription? listener; + StreamSubscription? privilegeListener; List employees = []; List privileges = []; @@ -26,28 +26,28 @@ class StaffModel extends BaseModel { @override logout() async { - if (listener != null) listener.cancel(); - if (privilegeListener != null) privilegeListener.cancel(); + if (listener != null) listener!.cancel(); + if (privilegeListener != null) privilegeListener!.cancel(); employees = []; privileges = []; } Future _loadEmployees() async { - if (user == null || !user.hasStaffs()) return; + if (user == null || !user!.hasStaffs()) throw "No Privilege"; try { - if (listener != null) listener.cancel(); + if (listener != null) listener!.cancel(); - listener = Firestore.instance + listener = FirebaseFirestore.instance .collection("/$user_collection") .where("is_employee", isEqualTo: true) .where("is_sys_admin", isEqualTo: false) .snapshots() .listen((QuerySnapshot snapshot) { employees.clear(); - employees = snapshot.documents.map((documentSnapshot) { + employees = snapshot.docs.map((documentSnapshot) { var user = - User.fromMap(documentSnapshot.data, documentSnapshot.documentID); + User.fromMap(documentSnapshot.data as Map, documentSnapshot.id); return user; }).toList(); notifyListeners(); @@ -59,14 +59,14 @@ class StaffModel extends BaseModel { Future _loadPrivileges() async { try { - privilegeListener = Firestore.instance + privilegeListener = FirebaseFirestore.instance .collection("/$privilege_collection") .snapshots() .listen((QuerySnapshot snapshot) { privileges.clear(); - privileges = snapshot.documents.map((documentSnapshot) { + privileges = snapshot.docs.map((documentSnapshot) { var privilege = Privilege.fromMap( - documentSnapshot.data, documentSnapshot.documentID); + documentSnapshot.data as Map, documentSnapshot.id); return privilege; }).toList(); notifyListeners(); @@ -82,27 +82,27 @@ class StaffModel extends BaseModel { token: await getToken()); } - Future findUser(String phoneNumber) { + Future findUser(String phoneNumber) { return Services.instance.userService.findUser(phoneNumber); } Future> getPickupEmployees() async { - if (user == null || !user.hasShipment()) return []; + if (user == null || !user!.hasShipment()) return []; return _getUsers(privilege_shipment); } Future> _getUsers(String privilege) async { List users = []; try { - var snaps = await Firestore.instance + var snaps = await FirebaseFirestore.instance .collection("/$user_collection") .where("is_employee", isEqualTo: true) .where("is_sys_admin", isEqualTo: false) .where("privileges", arrayContains: privilege) - .getDocuments(source: Source.server); - users = snaps.documents.map((documentSnapshot) { + .get(const GetOptions(source: Source.server)); + users = snaps.docs.map((documentSnapshot) { var user = - User.fromMap(documentSnapshot.data, documentSnapshot.documentID); + User.fromMap(documentSnapshot.data as Map, documentSnapshot.id); return user; }).toList(); } catch (e) { diff --git a/lib/pages/staff/staff_editor.dart b/lib/pages/staff/staff_editor.dart index 4812c32..67197e0 100644 --- a/lib/pages/staff/staff_editor.dart +++ b/lib/pages/staff/staff_editor.dart @@ -15,7 +15,7 @@ import 'package:provider/provider.dart'; typedef void FindCallBack(); class StaffEditor extends StatefulWidget { - final User staff; + final User? staff; const StaffEditor({this.staff}); @override _StaffEditorState createState() => _StaffEditorState(); @@ -25,8 +25,8 @@ class _StaffEditorState extends State { TextEditingController _phoneInput = new TextEditingController(); bool _isLoading = false; - User user; - User selectedUser; + late User user; + User? selectedUser; List privileges = []; bool isNew = true; @@ -38,8 +38,8 @@ class _StaffEditorState extends State { user = User(); if (!isNew) { user = - User(name: widget.staff.name, phoneNumber: widget.staff.phoneNumber); - user.privileges = widget.staff.privileges; + User(name: widget.staff!.name, phoneNumber: widget.staff!.phoneNumber); + user.privileges = widget.staff!.privileges; privileges.forEach((p) => user.privileges.contains(p.id) ? p.isChecked = true : p.isChecked = false); @@ -56,7 +56,7 @@ class _StaffEditorState extends State { title: InkWell( onTap: () { setState(() { - p.isChecked = p.isChecked == null ? true : !p.isChecked; + p.isChecked = p.isChecked == null ? true : !p.isChecked!; }); }, child: new Row( @@ -64,7 +64,8 @@ class _StaffEditorState extends State { new Checkbox( value: p.isChecked == null ? false : p.isChecked, activeColor: primaryColor, - onChanged: (bool value) { + onChanged: (bool? value) { + if(value != null) setState(() { p.isChecked = value; }); @@ -78,10 +79,10 @@ class _StaffEditorState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( - p.name, + p.name ??"", style: TextStyle(fontSize: 15.0, color: primaryColor), ), - Text(p.desc, + Text(p.desc ?? "", style: TextStyle(fontSize: 13, color: Colors.grey[600])) ], ), @@ -110,7 +111,7 @@ class _StaffEditorState extends State { style: textStyle, decoration: new InputDecoration( labelText: - AppTranslations.of(context).text('staff.phone.search'), + AppTranslations.of(context)!.text('staff.phone.search'), labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, // icon: Icon( // Icons.search, @@ -150,7 +151,7 @@ class _StaffEditorState extends State { ? Container() : IconButton( icon: Icon(Icons.open_in_new, color: primaryColor), - onPressed: () => call(context, user.phoneNumber)), + onPressed: () => call(context, user.phoneNumber!)), ], ); @@ -226,7 +227,7 @@ class _StaffEditorState extends State { }); StaffModel staffModel = Provider.of(context, listen: false); try { - await staffModel.updatePrivileges(this.selectedUser.id, privilegesIDs()); + await staffModel.updatePrivileges(this.selectedUser!.id!, privilegesIDs()); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -238,7 +239,7 @@ class _StaffEditorState extends State { } List privilegesIDs() { - return this.privileges.where((p) => p.isChecked).map((p) => p.id).toList(); + return this.privileges.where((p) => p.isChecked!).map((p) => p.id).toList(); } _save() async { @@ -248,7 +249,7 @@ class _StaffEditorState extends State { if (widget.staff == null) return; StaffModel staffModel = Provider.of(context, listen: false); try { - await staffModel.updatePrivileges(widget.staff.id, privilegesIDs()); + await staffModel.updatePrivileges(widget.staff!.id!, privilegesIDs()); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -267,7 +268,7 @@ class _StaffEditorState extends State { _isLoading = true; }); try { - User _user = await staffModel.findUser(_phoneInput.text); + User? _user = await staffModel.findUser(_phoneInput.text); if (_user == null) { showMsgDialog(context, "Error", _phoneInput.text + " not found!"); return; diff --git a/lib/pages/staff/staff_list.dart b/lib/pages/staff/staff_list.dart index fabcc6c..11fd119 100644 --- a/lib/pages/staff/staff_list.dart +++ b/lib/pages/staff/staff_list.dart @@ -5,7 +5,6 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -84,7 +83,7 @@ class _StaffListState extends State { padding: new EdgeInsets.symmetric( horizontal: 32.0 - dotSize / 2), child: Icon( - MaterialCommunityIcons.worker, + Icons.person, color: primaryColor, size: 40, ), @@ -94,13 +93,13 @@ class _StaffListState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( - user.name, + user.name ?? "", style: new TextStyle(fontSize: 15.0), ), Padding( padding: const EdgeInsets.only(top: 8.0), child: new Text( - user.phoneNumber, + user.phoneNumber ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/user_search/user_list_row.dart b/lib/pages/user_search/user_list_row.dart index da8822f..d7758c7 100644 --- a/lib/pages/user_search/user_list_row.dart +++ b/lib/pages/user_search/user_list_row.dart @@ -3,23 +3,12 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/user_search/user_serach.dart'; import 'package:flutter/material.dart'; -class UserListRow extends StatefulWidget { - final OnUserRowSelect onUserRowSelect; +class UserListRow extends StatelessWidget { + final OnUserRowSelect? onUserRowSelect; final User user; - const UserListRow({this.user, this.onUserRowSelect}); + const UserListRow({required this.user, this.onUserRowSelect}); - @override - _UserListRowState createState() => _UserListRowState(); -} - -class _UserListRowState extends State { final double dotSize = 15.0; - User user; - @override - void initState() { - super.initState(); - this.user = widget.user; - } @override Widget build(BuildContext context) { @@ -30,8 +19,7 @@ class _UserListRowState extends State { color: Colors.white, child: InkWell( onTap: () { - if (widget.onUserRowSelect != null) - widget.onUserRowSelect(widget.user); + if (onUserRowSelect != null) onUserRowSelect!(user); }, child: Row( children: [ @@ -53,17 +41,17 @@ class _UserListRowState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( - user.name == null ? '' : user.name, + user.name ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.black), ), new Text( - user.fcsID == null ? "" : user.fcsID, + user.fcsID ?? "", style: new TextStyle( fontSize: 13.0, color: Colors.grey), ), new Text( - user.phoneNumber == null ? "" : user.phoneNumber, + user.phoneNumber ?? "", style: new TextStyle( fontSize: 13.0, color: Colors.grey), ), diff --git a/lib/pages/user_search/user_serach.dart b/lib/pages/user_search/user_serach.dart index 0225b62..c61731c 100644 --- a/lib/pages/user_search/user_serach.dart +++ b/lib/pages/user_search/user_serach.dart @@ -8,8 +8,8 @@ import 'package:provider/provider.dart'; typedef OnUserSelect(User suer); typedef OnUserRowSelect(User suer); -Future searchUser(BuildContext context, - {OnUserSelect onUserSelect, bool popPage = false}) async => +Future searchUser(BuildContext context, + {required OnUserSelect onUserSelect, bool popPage = false}) async => await showSearch( context: context, delegate: @@ -17,10 +17,10 @@ Future searchUser(BuildContext context, ); class UserSearchDelegate extends SearchDelegate { - final OnUserSelect onUserSelect; + final OnUserSelect? onUserSelect; final bool popPage; - UserSearchDelegate({this.onUserSelect, this.popPage}); + UserSearchDelegate({required this.onUserSelect, required this.popPage}); @override String get searchFieldLabel => 'Search by FCS ID or Name'; @@ -31,10 +31,10 @@ class UserSearchDelegate extends SearchDelegate { return theme.copyWith( inputDecorationTheme: InputDecorationTheme( hintStyle: TextStyle( - color: theme.primaryTextTheme.caption.color, fontSize: 14)), + color: theme.primaryTextTheme.caption?.color, fontSize: 14)), textTheme: theme.textTheme.copyWith( - title: theme.textTheme.title.copyWith( - color: theme.primaryTextTheme.title.color, fontSize: 16)), + title: theme.textTheme.title?.copyWith( + color: theme.primaryTextTheme.title?.color, fontSize: 16)), primaryColor: primaryColor, ); } @@ -53,7 +53,7 @@ class UserSearchDelegate extends SearchDelegate { Widget buildLeading(BuildContext context) { return IconButton( icon: Icon(Icons.arrow_back), - onPressed: () => close(context, null), + onPressed: () => close(context, new User()), ); } @@ -64,7 +64,7 @@ class UserSearchDelegate extends SearchDelegate { future: packageModel.searchUser(query), builder: (context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { - if (snapshot.data.length == 0) { + if (snapshot.data == null || snapshot.data!.length == 0) { return Container( child: Center( child: Text( @@ -77,7 +77,7 @@ class UserSearchDelegate extends SearchDelegate { return Container( padding: EdgeInsets.only(top: 15), child: ListView( - children: snapshot.data + children: snapshot.data! .map((u) => UserListRow( user: u, onUserRowSelect: (u) => _onUserRowSelect(context, u), @@ -119,7 +119,7 @@ class UserSearchDelegate extends SearchDelegate { _onUserRowSelect(BuildContext context, User user) { if (onUserSelect != null) { - onUserSelect(user); + onUserSelect!(user); } if (popPage) { Navigator.pop(context); diff --git a/lib/pages/widgets/banner.dart b/lib/pages/widgets/banner.dart index 0b36a16..ef37127 100644 --- a/lib/pages/widgets/banner.dart +++ b/lib/pages/widgets/banner.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class FlavorBanner extends StatelessWidget { final Widget child; - FlavorBanner({@required this.child}); + FlavorBanner({required this.child}); @override Widget build(BuildContext context) { diff --git a/lib/pages/widgets/barcode_scanner.dart b/lib/pages/widgets/barcode_scanner.dart index 2706a21..a8124b8 100644 --- a/lib/pages/widgets/barcode_scanner.dart +++ b/lib/pages/widgets/barcode_scanner.dart @@ -1,9 +1,9 @@ -import 'package:barcode_scan/barcode_scan.dart'; +import 'package:barcode_scan2/platform_wrapper.dart'; -Future scanBarcode() async { +Future scanBarcode() async { try { - String barcode = await BarcodeScanner.scan(); - if (barcode == null) return null; + var scanResult = await BarcodeScanner.scan(); + String barcode = scanResult.rawContent; String gs = String.fromCharCode(29); if (barcode.contains(gs)) { diff --git a/lib/pages/widgets/bottom_widgets.dart b/lib/pages/widgets/bottom_widgets.dart index c64ff11..067a134 100644 --- a/lib/pages/widgets/bottom_widgets.dart +++ b/lib/pages/widgets/bottom_widgets.dart @@ -5,7 +5,7 @@ import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; class BottomWidgets extends StatelessWidget { @@ -13,7 +13,7 @@ class BottomWidgets extends StatelessWidget { Widget build(BuildContext context) { var pkgInfo = Provider.of(context).packageInfo; final versionBox = Text( - "v${pkgInfo.version}+${pkgInfo.buildNumber}", + "v${pkgInfo?.version}+${pkgInfo?.buildNumber}", style: TextStyle(color: Colors.white30), ); return Column( diff --git a/lib/pages/widgets/defalut_delivery_address.dart b/lib/pages/widgets/defalut_delivery_address.dart index 649abcf..3610701 100644 --- a/lib/pages/widgets/defalut_delivery_address.dart +++ b/lib/pages/widgets/defalut_delivery_address.dart @@ -3,20 +3,20 @@ import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/delivery_address/delivery_address_row.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'callbacks.dart'; import 'display_text.dart'; import 'local_text.dart'; class DefaultDeliveryAddress extends StatelessWidget { - final DeliveryAddress deliveryAddress; - final String labelKey; - final OnTap onTap; - final IconData iconData; + final DeliveryAddress? deliveryAddress; + final String? labelKey; + final OnTap? onTap; + final IconData? iconData; const DefaultDeliveryAddress( - {Key key, this.deliveryAddress, this.onTap, this.labelKey, this.iconData}) + {Key? key, this.deliveryAddress, this.onTap, this.labelKey, this.iconData}) : super(key: key); @override @@ -37,7 +37,7 @@ class DefaultDeliveryAddress extends StatelessWidget { onTap == null ? Container() : GestureDetector( - onTap: () => onTap(), + onTap: () => onTap!(), child: Chip( label: LocalText( context, "delivery_address.change_address", @@ -50,8 +50,8 @@ class DefaultDeliveryAddress extends StatelessWidget { child: deliveryAddress == null ? Container() : DeliveryAddressRow( - key: ValueKey(deliveryAddress.id), - deliveryAddress: deliveryAddress), + key: ValueKey(deliveryAddress!.id), + deliveryAddress: deliveryAddress!), ), ], ); diff --git a/lib/pages/widgets/delivery_address_selection.dart b/lib/pages/widgets/delivery_address_selection.dart index 08ee77f..1f1b0a6 100644 --- a/lib/pages/widgets/delivery_address_selection.dart +++ b/lib/pages/widgets/delivery_address_selection.dart @@ -10,11 +10,11 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class DeliveryAddressSelection extends StatefulWidget { - final DeliveryAddress deliveryAddress; - final User user; + final DeliveryAddress? deliveryAddress; + final User? user; const DeliveryAddressSelection({ - Key key, + Key? key, this.deliveryAddress, this.user, }) : super(key: key); @@ -38,7 +38,7 @@ class _DeliveryAddressSelectionState extends State { Provider.of(context, listen: false); var deliveryAddresses = - await addressModel.getDeliveryAddresses(widget.user.id); + await addressModel.getDeliveryAddresses(widget.user!.id!); setState(() { this._deliveryAddresses = deliveryAddresses; }); @@ -64,7 +64,7 @@ class _DeliveryAddressSelectionState extends State { bool updated = await Navigator.of(context).push(CupertinoPageRoute( builder: (context) => DeliveryAddressEditor(user: widget.user))); - if (updated ?? false) { + if (updated) { _getDeliverAddresses(); } }, @@ -95,7 +95,7 @@ class _DeliveryAddressSelectionState extends State { padding: const EdgeInsets.all(10.0), child: Icon(Icons.check, color: widget.deliveryAddress != null && - _deliveryAddress.id == widget.deliveryAddress.id + _deliveryAddress.id == widget.deliveryAddress!.id ? primaryColor : Colors.black26), ), @@ -117,7 +117,7 @@ class _DeliveryAddressSelectionState extends State { bool updated = await Navigator.of(context).push(CupertinoPageRoute( builder: (context) => DeliveryAddressEditor( user: widget.user, deliveryAddress: deliveryAddress))); - if (updated ?? false) { + if (updated) { _getDeliverAddresses(); } } diff --git a/lib/pages/widgets/dialog_input.dart b/lib/pages/widgets/dialog_input.dart index 249e3a1..c1c0a4a 100644 --- a/lib/pages/widgets/dialog_input.dart +++ b/lib/pages/widgets/dialog_input.dart @@ -5,10 +5,10 @@ import 'package:flutter/material.dart'; import 'local_text.dart'; class DialogInput extends StatefulWidget { - final String value; - final String label; + final String? value; + final String? label; - const DialogInput({Key key, this.label, this.value}) : super(key: key); + const DialogInput({Key? key, this.label, this.value}) : super(key: key); @override _DialogInputState createState() => _DialogInputState(); } @@ -24,7 +24,7 @@ class _DialogInputState extends State { void initState() { super.initState(); if (widget.value != null) { - _controller.text = widget.value; + _controller.text = widget.value!; _focusNode.addListener(() { if (_focusNode.hasFocus) { _controller.selection = TextSelection( @@ -41,7 +41,7 @@ class _DialogInputState extends State { child: AlertDialog( title: LocalText( context, - widget.label, + widget.label!, fontSize: 20, color: primaryColor, ), @@ -77,7 +77,7 @@ class _DialogInputState extends State { fontWeight: FontWeight.bold, ), onPressed: () async { - if (!_formKey.currentState.validate()) return; + if (!_formKey.currentState!.validate()) return; _save(); }) ], diff --git a/lib/pages/widgets/discount_dropdown.dart b/lib/pages/widgets/discount_dropdown.dart index 63bf769..8f00fa7 100644 --- a/lib/pages/widgets/discount_dropdown.dart +++ b/lib/pages/widgets/discount_dropdown.dart @@ -6,13 +6,13 @@ import 'package:flutter/material.dart'; import 'local_text.dart'; class DiscountDropdown extends StatelessWidget { - final Function(T) callback; - final IconData iconData; - final T selectedValue; - final List values; + final Function(T)? callback; + final IconData? iconData; + final T? selectedValue; + final List? values; const DiscountDropdown( - {Key key, this.callback, this.iconData, this.selectedValue, this.values}) + {Key? key, this.callback, this.iconData, this.selectedValue, this.values}) : super(key: key); @override @@ -46,14 +46,15 @@ class DiscountDropdown extends StatelessWidget { height: 1, color: primaryColor, ), - onChanged: (T newValue) { - callback(newValue); + onChanged: (T? newValue) { + callback!(newValue!); }, isExpanded: true, - items: values.map>((T value) { + items: values!.map>((T value) { return DropdownMenuItem( value: value, - child: Text(value == null ? "" : (value as Discount).code, + child: Text( + value == null ? "" : (value as Discount).code!, overflow: TextOverflow.ellipsis, style: TextStyle(color: primaryColor)), ); diff --git a/lib/pages/widgets/display_image_source.dart b/lib/pages/widgets/display_image_source.dart index 444586d..b60ad53 100644 --- a/lib/pages/widgets/display_image_source.dart +++ b/lib/pages/widgets/display_image_source.dart @@ -4,21 +4,30 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/widgets.dart'; class DisplayImageSource { - String url; - File file; + String? url; + File? file; DisplayImageSource({this.url, this.file}); - ImageProvider get imageProvider => - file == null ? CachedNetworkImageProvider(url) : FileImage(file); + ImageProvider get imageProvider { + if (file == null) { + return CachedNetworkImageProvider(url!); + } else { + return FileImage(file!); + } + } @override bool operator ==(other) { - if (identical(this, other)) { + if (identical(this, other) && other is DisplayImageSource) { return true; } - return (other.file == this.file && + + return (other is DisplayImageSource && + other.file == this.file && (other.file != null || this.file != null)) || - (other.url == this.url && (other.url != null || this.url != null)); + (other is DisplayImageSource && + other.url == this.url && + (other.url != null || this.url != null)); } @override diff --git a/lib/pages/widgets/display_text.dart b/lib/pages/widgets/display_text.dart index 8d36a9f..c8f8801 100644 --- a/lib/pages/widgets/display_text.dart +++ b/lib/pages/widgets/display_text.dart @@ -6,16 +6,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class DisplayText extends StatelessWidget { - final String text; - final String labelTextKey; - final IconData iconData; - final int maxLines; - final bool withBorder; - final Color borderColor; - final Widget icon; + final String? text; + final String? labelTextKey; + final IconData? iconData; + final int? maxLines; + final bool? withBorder; + final Color? borderColor; + final Widget? icon; const DisplayText({ - Key key, + Key? key, this.text, this.labelTextKey, this.iconData, @@ -44,7 +44,9 @@ class DisplayText extends StatelessWidget { child: Row( children: [ iconData == null - ? icon == null ? Container() : icon + ? icon == null + ? Container() + : icon! : Padding( padding: const EdgeInsets.only( left: .0, right: 15.0, top: 8.0, bottom: 8.0), @@ -60,13 +62,13 @@ class DisplayText extends StatelessWidget { labelTextKey == null ? Container() : Text( - AppTranslations.of(context).text(labelTextKey), + AppTranslations.of(context)!.text(labelTextKey!), style: labelStyle, ), text == null ? Container() : Text( - text, + text!, style: textStyle, ), ], diff --git a/lib/pages/widgets/fcs_expansion_tile.dart b/lib/pages/widgets/fcs_expansion_tile.dart index f74365e..e1d31eb 100644 --- a/lib/pages/widgets/fcs_expansion_tile.dart +++ b/lib/pages/widgets/fcs_expansion_tile.dart @@ -5,10 +5,10 @@ import 'package:flutter/material.dart'; import 'callbacks.dart'; class FcsExpansionTile extends StatefulWidget { - final ValueChanged onExpansionChanged; - final CallBack onEditPress; - final List children; - final Widget title; + final ValueChanged? onExpansionChanged; + final CallBack? onEditPress; + final List? children; + final Widget? title; final bool isEdit; const FcsExpansionTile( {this.onExpansionChanged, @@ -21,7 +21,7 @@ class FcsExpansionTile extends StatefulWidget { } class _FcsExpansionTileState extends State { - bool expanded; + bool? expanded; @override void initState() { this.expanded = false; @@ -39,22 +39,22 @@ class _FcsExpansionTileState extends State { expanded = value; }); if (widget.onExpansionChanged != null) - widget.onExpansionChanged(value); + widget.onExpansionChanged!(value); }, - title: widget.title, - children: widget.children, + title: widget.title != null ? widget.title! : Container(), + children: widget.children != null ? widget.children! : [Container()], trailing: widget.isEdit ? IconButton( padding: EdgeInsets.all(0), iconSize: 20, onPressed: () => - widget.onEditPress != null ? widget.onEditPress() : {}, + widget.onEditPress != null ? widget.onEditPress!() : {}, icon: Icon( Icons.edit, color: primaryColor, )) : AnimatedSwitcher( - child: expanded + child: expanded! ? Icon( Icons.remove, color: primaryColor, diff --git a/lib/pages/widgets/fcs_icons.dart b/lib/pages/widgets/fcs_icons.dart index 19c844e..8f7e95b 100644 --- a/lib/pages/widgets/fcs_icons.dart +++ b/lib/pages/widgets/fcs_icons.dart @@ -1,4 +1,4 @@ -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; const cartonIconData = MaterialCommunityIcons.package; const customFeeIconData = MaterialCommunityIcons.security; diff --git a/lib/pages/widgets/image_file_picker.dart b/lib/pages/widgets/image_file_picker.dart index 8efc2f6..a495e97 100644 --- a/lib/pages/widgets/image_file_picker.dart +++ b/lib/pages/widgets/image_file_picker.dart @@ -1,13 +1,13 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:image_picker/image_picker.dart'; import 'local_text.dart'; typedef OnFile = void Function(File); -modelBottomSheet(BuildContext context, {final OnFile onFile}) { +modelBottomSheet(BuildContext context, {final OnFile? onFile}) { showModalBottomSheet( elevation: 10, backgroundColor: Colors.white, @@ -18,15 +18,15 @@ modelBottomSheet(BuildContext context, {final OnFile onFile}) { } class ImageFile extends StatefulWidget { - final OnFile onFile; + final OnFile? onFile; - const ImageFile({Key key, this.onFile}) : super(key: key); + const ImageFile({Key? key, this.onFile}) : super(key: key); @override _ImageFileState createState() => _ImageFileState(); } class _ImageFileState extends State { - File selectedFile; + File? selectedFile; @override Widget build(BuildContext context) { return Container( @@ -44,7 +44,7 @@ class _ImageFileState extends State { onTap: () async { Navigator.pop(context); selectedFile = await pickImage(ImageSource.gallery); - if (widget.onFile != null) widget.onFile(selectedFile); + if (widget.onFile != null) widget.onFile!(selectedFile!); }), new ListTile( leading: CircleAvatar( @@ -58,7 +58,7 @@ class _ImageFileState extends State { Navigator.pop(context); selectedFile = await pickImage(ImageSource.camera); - if (widget.onFile != null) widget.onFile(selectedFile); + if (widget.onFile != null) widget.onFile!(selectedFile!); }, ), new ListTile( @@ -75,7 +75,7 @@ class _ImageFileState extends State { selectedFile = null; }); - if (widget.onFile != null) widget.onFile(selectedFile); + if (widget.onFile != null) widget.onFile!(selectedFile!); }, ), ], @@ -84,7 +84,7 @@ class _ImageFileState extends State { } pickImage(ImageSource source) async { - var tempImage = await ImagePicker.pickImage(source: source); + var tempImage = await ImagePicker().pickImage(source: source); return tempImage; } } diff --git a/lib/pages/widgets/img_picker.dart b/lib/pages/widgets/img_picker.dart index 71fc9c2..43e2fb1 100644 --- a/lib/pages/widgets/img_picker.dart +++ b/lib/pages/widgets/img_picker.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:fcs/helpers/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -7,19 +8,19 @@ import 'package:image_picker/image_picker.dart'; import 'show_img.dart'; -typedef OnFile = void Function(File); +typedef OnFile = void Function(File?); class LocalImagePicker extends StatefulWidget { - final Color color; + final Color? color; final String title; - final OnFile onFile; + final OnFile? onFile; final bool enabled; - final String initialImgUrl; + final String? initialImgUrl; final ImageSource imageSource; const LocalImagePicker( - {Key key, - this.title, + {Key? key, + required this.title, this.onFile, this.enabled = true, this.initialImgUrl, @@ -31,8 +32,8 @@ class LocalImagePicker extends StatefulWidget { } class _LocalImagePickerState extends State { - String url; - File file; + String? url; + File? file; @override void initState() { @@ -56,16 +57,16 @@ class _LocalImagePickerState extends State { await _dialog( context, () => camera = true, () => gallery = true); if (camera || gallery) { - var selectedFile = await ImagePicker.pickImage( + var selectedFile = await ImagePicker().pickImage( source: camera ? ImageSource.camera : ImageSource.gallery, imageQuality: 80, maxWidth: 1000); if (selectedFile != null) { setState(() { - this.file = selectedFile; + this.file = File(selectedFile.path); }); if (widget.onFile != null) { - widget.onFile(selectedFile); + widget.onFile!(File(selectedFile.path)); } } } @@ -93,7 +94,7 @@ class _LocalImagePickerState extends State { this.file = null; this.url = null; if (widget.onFile != null) { - widget.onFile(null); + widget.onFile!(null); } }); }, diff --git a/lib/pages/widgets/img_url.dart b/lib/pages/widgets/img_url.dart index 5747a5e..6cdb69e 100644 --- a/lib/pages/widgets/img_url.dart +++ b/lib/pages/widgets/img_url.dart @@ -8,10 +8,10 @@ import 'show_img.dart'; typedef OnFile = void Function(File); class ImageUrl extends StatefulWidget { - final String title; - final String url; + final String? title; + final String? url; - const ImageUrl({Key key, this.title, this.url}) : super(key: key); + const ImageUrl({Key? key, this.title, this.url}) : super(key: key); @override _ImageUrlState createState() => _ImageUrlState(); } @@ -25,12 +25,12 @@ class _ImageUrlState extends State { context, MaterialPageRoute( builder: (context) => - ShowImage(url: widget.url, fileName: widget.title)), + ShowImage(url: widget.url!, fileName: widget.title!)), ) }, child: Chip( avatar: Icon(Icons.image), - label: Text(widget.title), + label: Text(widget.title!), ), ); } diff --git a/lib/pages/widgets/input_date.dart b/lib/pages/widgets/input_date.dart index c490584..4ee726a 100644 --- a/lib/pages/widgets/input_date.dart +++ b/lib/pages/widgets/input_date.dart @@ -10,19 +10,19 @@ class InputDate extends StatelessWidget { final String labelTextKey; final IconData iconData; final TextEditingController controller; - final FormFieldValidator validator; + final FormFieldValidator? validator; final int maxLines; final bool withBorder; - final Color borderColor; - final TextInputType textInputType; + final Color? borderColor; + final TextInputType? textInputType; final bool autoFocus; final String dateFormatString; const InputDate( - {Key key, - this.labelTextKey, - this.iconData, - this.controller, + {Key? key, + required this.labelTextKey, + required this.iconData, + required this.controller, this.validator, this.maxLines = 1, this.withBorder = false, @@ -72,7 +72,7 @@ class InputDate extends StatelessWidget { ), labelText: labelTextKey == null ? null - : AppTranslations.of(context).text(labelTextKey), + : AppTranslations.of(context)!.text(labelTextKey), labelStyle: languageModel.isEng ? newLabelStyle(color: Colors.black54, fontSize: 20) : newLabelStyleMM(color: Colors.black54, fontSize: 20), diff --git a/lib/pages/widgets/input_text.dart b/lib/pages/widgets/input_text.dart index c94d3ab..639d4b0 100644 --- a/lib/pages/widgets/input_text.dart +++ b/lib/pages/widgets/input_text.dart @@ -6,20 +6,20 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class InputText extends StatelessWidget { - final String labelTextKey; - final IconData iconData; - final TextEditingController controller; - final FormFieldValidator validator; + final String? labelTextKey; + final IconData? iconData; + final TextEditingController? controller; + final FormFieldValidator? validator; final int maxLines; final bool withBorder; - final Color borderColor; - final TextInputType textInputType; + final Color? borderColor; + final TextInputType? textInputType; final bool autoFocus; final TextAlign textAlign; final bool enabled; const InputText( - {Key key, + {Key? key, this.labelTextKey, this.iconData, this.controller, @@ -30,7 +30,7 @@ class InputText extends StatelessWidget { this.autoFocus = false, this.textInputType, this.enabled = true, - this.textAlign}) + this.textAlign = TextAlign.start}) : super(key: key); @override Widget build(BuildContext context) { @@ -46,7 +46,7 @@ class InputText extends StatelessWidget { style: textStyle, maxLines: maxLines, keyboardType: textInputType, - textAlign: textAlign ?? TextAlign.start, + textAlign: textAlign, decoration: new InputDecoration( // hintText: '', hintStyle: TextStyle( @@ -54,7 +54,7 @@ class InputText extends StatelessWidget { ), labelText: labelTextKey == null ? null - : AppTranslations.of(context).text(labelTextKey), + : AppTranslations.of(context)!.text(labelTextKey!), labelStyle: languageModel.isEng ? newLabelStyle(color: Colors.black54, fontSize: 20) : newLabelStyleMM(color: Colors.black54, fontSize: 20), diff --git a/lib/pages/widgets/input_time.dart b/lib/pages/widgets/input_time.dart index 1311bf6..8c283a1 100644 --- a/lib/pages/widgets/input_time.dart +++ b/lib/pages/widgets/input_time.dart @@ -7,18 +7,18 @@ import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class InputTime extends StatelessWidget { - final String labelTextKey; - final IconData iconData; - final TextEditingController controller; - final FormFieldValidator validator; + final String? labelTextKey; + final IconData? iconData; + final TextEditingController? controller; + final FormFieldValidator? validator; final int maxLines; final bool withBorder; - final Color borderColor; - final TextInputType textInputType; + final Color? borderColor; + final TextInputType? textInputType; final bool autoFocus; const InputTime( - {Key key, + {Key? key, this.labelTextKey, this.iconData, this.controller, @@ -45,14 +45,14 @@ class InputTime extends StatelessWidget { try { final format = DateFormat.jm(); //"6:00 AM" initialDate = - TimeOfDay.fromDateTime(format.parse(controller.text)); + TimeOfDay.fromDateTime(format.parse(controller!.text)); // var values = controller.text.split(":"); // initialDate = TimeOfDay( // hour: int.parse(values[0]), minute: int.parse(values[1])); } catch (e) {} // ignore error } - TimeOfDay t = await showTimePicker( + TimeOfDay? t = await showTimePicker( initialTime: initialDate, context: context, ); @@ -61,7 +61,7 @@ class InputTime extends StatelessWidget { final now = new DateTime.now(); final dt = DateTime(now.year, now.month, now.day, t.hour, t.minute); - controller.text = "${format.format(dt)}"; + controller!.text = "${format.format(dt)}"; } }, controller: controller, @@ -77,7 +77,7 @@ class InputTime extends StatelessWidget { ), labelText: labelTextKey == null ? null - : AppTranslations.of(context).text(labelTextKey), + : AppTranslations.of(context)!.text(labelTextKey!), labelStyle: languageModel.isEng ? newLabelStyle(color: Colors.black54, fontSize: 20) : newLabelStyleMM(color: Colors.black54, fontSize: 20), diff --git a/lib/pages/widgets/length_picker.dart b/lib/pages/widgets/length_picker.dart index fe298c8..79bbd81 100644 --- a/lib/pages/widgets/length_picker.dart +++ b/lib/pages/widgets/length_picker.dart @@ -10,13 +10,13 @@ const MAX_INC = 50.0; const MAX_FEET = 25.0; class LengthPicker extends StatefulWidget { - final TextEditingController controller; - final String lableKey; + final TextEditingController? controller; + final String? lableKey; final bool isReadOnly; final bool displayFeet; const LengthPicker( - {Key key, + {Key? key, this.controller, this.lableKey, this.isReadOnly = false, @@ -35,14 +35,14 @@ class _LengthPickerState extends State { super.initState(); if (widget.controller != null) { _setText(); - widget.controller.addListener(() { + widget.controller!.addListener(() { _setText(); }); } } _setText() { - double v = double.parse(widget.controller.text, (s) => 0); + double v = double.parse(widget.controller!.text, (s) => 0); int _v = v.toInt(); int f = (v / 12).floor(); @@ -72,8 +72,8 @@ class _LengthPickerState extends State { context: context, builder: (BuildContext context) { return LengthPickerDialog( - controller: widget.controller, - labelKey: widget.lableKey, + controller: widget.controller!, + labelKey: widget.lableKey!, displayFeet: widget.displayFeet, ); }, @@ -82,12 +82,12 @@ class _LengthPickerState extends State { } class LengthPickerDialog extends StatefulWidget { - final TextEditingController controller; - final String labelKey; - final bool displayFeet; + final TextEditingController? controller; + final String? labelKey; + final bool? displayFeet; const LengthPickerDialog( - {Key key, this.controller, this.labelKey, this.displayFeet}) + {Key? key, this.controller, this.labelKey, this.displayFeet}) : super(key: key); @override @@ -95,8 +95,8 @@ class LengthPickerDialog extends StatefulWidget { } class _LengthPickerDialogState extends State { - int _valueFeet; - int _valueInc; + late int _valueFeet; + late int _valueInc; TextEditingController inchInputController = TextEditingController(); TextEditingController feetInputController = TextEditingController(); final _focusNode = FocusNode(); @@ -107,9 +107,9 @@ class _LengthPickerDialogState extends State { _valueFeet = 0; _valueInc = 0; if (widget.controller != null) { - double v = double.parse(widget.controller.text, (s) => 0); + double v = double.parse(widget.controller!.text, (s) => 0); _valueFeet = (v / 12).floor(); - _valueInc = widget.displayFeet ? (v % 12).toInt() : v.toInt(); + _valueInc = widget.displayFeet! ? (v % 12).toInt() : v.toInt(); inchInputController.text = _valueInc.toString(); feetInputController.text = _valueFeet.toString(); } @@ -144,7 +144,8 @@ class _LengthPickerDialogState extends State { borderSide: BorderSide(color: primaryColor, width: 1.0), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey[400], width: 1.0), + borderSide: + BorderSide(color: Colors.grey.shade400, width: 1.0), ), ), ), @@ -196,7 +197,8 @@ class _LengthPickerDialogState extends State { borderSide: BorderSide(color: primaryColor, width: 1.0), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey[400], width: 1.0), + borderSide: + BorderSide(color: Colors.grey.shade400, width: 1.0), ), ), ), @@ -233,14 +235,14 @@ class _LengthPickerDialogState extends State { title: Center( child: LocalText( context, - widget.labelKey, + widget.labelKey!, color: primaryColor, fontSize: 16, )), children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceAround, - children: widget.displayFeet + children: widget.displayFeet! ? [ Container(width: 100, child: feetBox), Container(width: 100, child: inchBox), @@ -252,7 +254,7 @@ class _LengthPickerDialogState extends State { SizedBox( height: 10, ), - widget.displayFeet + widget.displayFeet! ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -273,7 +275,7 @@ class _LengthPickerDialogState extends State { min: 0, max: MAX_FEET, divisions: 100, - label: (_valueFeet ?? 0).round().toString(), + label: _valueFeet.round().toString(), onChanged: (double v) { _updateFeet(v); }, @@ -295,13 +297,13 @@ class _LengthPickerDialogState extends State { ), Slider( activeColor: primaryColor, - value: _valueInc.toDouble() > (widget.displayFeet ? 11 : MAX_INC) + value: _valueInc.toDouble() > (widget.displayFeet! ? 11 : MAX_INC) ? 0 : _valueInc.toDouble(), min: 0, - max: widget.displayFeet ? 11 : MAX_INC, + max: widget.displayFeet! ? 11 : MAX_INC, divisions: 100, - label: (_valueInc ?? 0).round().toString(), + label: _valueInc.round().toString(), onChanged: (double v) { _updateInc(v); }, @@ -318,10 +320,10 @@ class _LengthPickerDialogState extends State { }); int _v = _valueInc.round() + _valueFeet.round() * 12; if (widget.controller != null) { - widget.controller.text = _v.toString(); + widget.controller!.text = _v.toString(); } feetInputController.text = - widget.displayFeet ? _valueFeet.round().toString() : _v.toString(); + widget.displayFeet! ? _valueFeet.round().toString() : _v.toString(); } _updateInc(double v) { @@ -330,8 +332,8 @@ class _LengthPickerDialogState extends State { }); int _v = _valueInc.round() + _valueFeet.round() * 12; if (widget.controller != null) { - widget.controller.text = - widget.displayFeet ? _v.toString() : _valueInc.toString(); + widget.controller!.text = + widget.displayFeet! ? _v.toString() : _valueInc.toString(); } inchInputController.text = _valueInc.toString(); } @@ -343,8 +345,8 @@ class _LengthPickerDialogState extends State { }); int _v = _valueInc.round() + _valueFeet.round() * 12; if (widget.controller != null) { - widget.controller.text = - widget.displayFeet ? _v.toString() : _valueInc.toString(); + widget.controller!.text = + widget.displayFeet! ? _v.toString() : _valueInc.toString(); } } @@ -355,7 +357,7 @@ class _LengthPickerDialogState extends State { }); int _v = _valueInc.round() + _valueFeet.round() * 12; if (widget.controller != null) { - widget.controller.text = _v.toString(); + widget.controller!.text = _v.toString(); } } diff --git a/lib/pages/widgets/local_button.dart b/lib/pages/widgets/local_button.dart index e7d4edf..8c52eb2 100644 --- a/lib/pages/widgets/local_button.dart +++ b/lib/pages/widgets/local_button.dart @@ -6,13 +6,13 @@ import 'package:flutter/material.dart'; import 'callbacks.dart'; class LocalButton extends StatelessWidget { - final CallBack callBack; - final IconData iconData; - final String textKey; - final Color color; + final CallBack? callBack; + final IconData? iconData; + final String? textKey; + final Color? color; const LocalButton( - {Key key, + {Key? key, this.callBack, this.iconData, this.textKey, @@ -33,7 +33,7 @@ class LocalButton extends StatelessWidget { minWidth: 900.0, height: 100.0, child: FlatButton( - onPressed: callBack == null ? null : () => callBack(), + onPressed: callBack == null ? null : () => callBack!(), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -48,7 +48,7 @@ class LocalButton extends StatelessWidget { ), LocalText( context, - textKey, + textKey!, color: Colors.white, fontSize: 16, ), diff --git a/lib/pages/widgets/local_dropdown.dart b/lib/pages/widgets/local_dropdown.dart index b61c3b8..aa6eb8e 100644 --- a/lib/pages/widgets/local_dropdown.dart +++ b/lib/pages/widgets/local_dropdown.dart @@ -5,15 +5,15 @@ import 'package:flutter/material.dart'; import 'local_text.dart'; class LocalDropdown extends StatelessWidget { - final Function(T) callback; - final IconData iconData; - final T selectedValue; - final List values; - final Function(T) display; - final String labelKey; + final Function(T)? callback; + final IconData? iconData; + final T? selectedValue; + final List? values; + final Function(T)? display; + final String? labelKey; const LocalDropdown( - {Key key, + {Key? key, this.callback, this.iconData, this.selectedValue, @@ -40,7 +40,7 @@ class LocalDropdown extends StatelessWidget { padding: const EdgeInsets.only(right: 18.0), child: LocalText( context, - labelKey, + labelKey!, color: Colors.black54, fontSize: 16, ), @@ -53,20 +53,20 @@ class LocalDropdown extends StatelessWidget { height: 1, color: Colors.grey, ), - onChanged: (T newValue) { - callback(newValue); + onChanged: (T? newValue) { + callback!(newValue!); }, isExpanded: true, items: values == null ? [] - : values.map>((T value) { + : values!.map>((T value) { return DropdownMenuItem( value: value, child: Text( value == null ? "" : display != null - ? display(value) + ? display!(value) : value.toString(), overflow: TextOverflow.ellipsis, style: TextStyle(color: primaryColor)), diff --git a/lib/pages/widgets/local_popup_menu_button.dart b/lib/pages/widgets/local_popup_menu_button.dart index 53701e7..8fa1e62 100644 --- a/lib/pages/widgets/local_popup_menu_button.dart +++ b/lib/pages/widgets/local_popup_menu_button.dart @@ -7,15 +7,15 @@ import 'local_popupmenu.dart'; typedef PopupMenuCallback = Function(LocalPopupMenu popupMenu); class LocalPopupMenuButton extends StatefulWidget { - final PopupMenuCallback popupMenuCallback; - final List popmenus; + final PopupMenuCallback? popupMenuCallback; + final List? popmenus; final bool multiSelect; final bool selectable; - final IconData buttonIcon; + final IconData? buttonIcon; final Color buttonColor; const LocalPopupMenuButton( - {Key key, + {Key? key, this.popupMenuCallback, this.popmenus, this.buttonIcon, @@ -29,11 +29,11 @@ class LocalPopupMenuButton extends StatefulWidget { } class _LocalPopupMenuButtonState extends State { - List popmenus; + late List popmenus; @override void initState() { - popmenus = widget.popmenus; + popmenus = widget.popmenus!; super.initState(); } @@ -64,7 +64,7 @@ class _LocalPopupMenuButtonState extends State { } } if (selected.enabled && widget.popupMenuCallback != null) - widget.popupMenuCallback(selected); + widget.popupMenuCallback!(selected); }, icon: Container( width: 30, @@ -78,7 +78,7 @@ class _LocalPopupMenuButtonState extends State { children: [ Icon( widget.buttonIcon ?? Icons.filter_list, - color: widget.buttonColor ?? primaryColor, + color: widget.buttonColor, ), hightlight ? Positioned( @@ -98,14 +98,12 @@ class _LocalPopupMenuButtonState extends State { )), itemBuilder: (BuildContext context) { return popmenus.map((LocalPopupMenu choice) { - if (choice == null) return null; return PopupMenuItem( value: choice, child: Row( children: [ - LocalText(context, choice.textKey, - color: - choice?.enabled ?? true ? primaryColor : Colors.grey), + LocalText(context, choice.textKey ?? "", + color: choice.enabled ? primaryColor : Colors.grey), SizedBox( width: 10, ), @@ -124,8 +122,8 @@ class _LocalPopupMenuButtonState extends State { bool _needHighlight() { popmenus.forEach((e) { - if (e == null) return false; - if (e.selected && e.highlight) return true; + if (e == null) return; + if (e.selected && e.highlight) return; }); return false; } diff --git a/lib/pages/widgets/local_popupmenu.dart b/lib/pages/widgets/local_popupmenu.dart index d3778ee..d5931b1 100644 --- a/lib/pages/widgets/local_popupmenu.dart +++ b/lib/pages/widgets/local_popupmenu.dart @@ -1,11 +1,11 @@ class LocalPopupMenu { int id; - String textKey; + String? textKey; bool selected; bool highlight; bool enabled; LocalPopupMenu( - {this.id, + {required this.id, this.textKey, this.selected = false, this.highlight = false, diff --git a/lib/pages/widgets/local_radio_buttons.dart b/lib/pages/widgets/local_radio_buttons.dart index e2b2f96..11c72ad 100644 --- a/lib/pages/widgets/local_radio_buttons.dart +++ b/lib/pages/widgets/local_radio_buttons.dart @@ -3,15 +3,15 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class LocalRadioButtons extends StatelessWidget { - final Function(T) callback; - final IconData iconData; - final T selectedValue; - final List values; + final Function(T)? callback; + final IconData? iconData; + final T? selectedValue; + final List? values; final bool readOnly; final bool hideUnselected; const LocalRadioButtons( - {Key key, + {Key? key, this.callback, this.iconData, this.selectedValue, @@ -26,19 +26,19 @@ class LocalRadioButtons extends StatelessWidget { } List getChildren() { - return values + return values! .toList() .map((e) => SizedBox( height: 30, child: InkWell( - onTap: () => callback(e), + onTap: () => callback!(e), child: Row(children: [ Radio( activeColor: primaryColor, groupValue: selectedValue, value: e, - onChanged: (T value) { - callback(value); + onChanged: (T? value) { + callback!(value!); }, ), Text(e.toString()), @@ -48,7 +48,7 @@ class LocalRadioButtons extends StatelessWidget { } List getReadonlyChildren() { - return values + return values! .toList() .map((e) => hideUnselected && e == selectedValue ? SizedBox( diff --git a/lib/pages/widgets/local_text.dart b/lib/pages/widgets/local_text.dart index c302796..92fbff8 100644 --- a/lib/pages/widgets/local_text.dart +++ b/lib/pages/widgets/local_text.dart @@ -7,26 +7,26 @@ import 'package:fcs/helpers/theme.dart'; class LocalText extends Text { final BuildContext context; LocalText(this.context, String translationKey, - {Color color, - double fontSize, - FontWeight fontWeight, - List translationVariables, - String text, + {Color? color, + double? fontSize, + FontWeight? fontWeight, + List? translationVariables, + String? text, bool underline = false}) : super( text ?? - AppTranslations.of(context).text(translationKey, + AppTranslations.of(context)!.text(translationKey, translationVariables: translationVariables), style: Provider.of(context, listen: false).isEng ? newLabelStyle( - color: color, - fontSize: fontSize, - fontWeight: fontWeight, + color: color!, + fontSize: fontSize!, + fontWeight: fontWeight!, underline: underline) : newLabelStyleMM( - color: color, - fontSize: fontSize, - fontWeight: fontWeight, + color: color!, + fontSize: fontSize!, + fontWeight: fontWeight!, underline: underline)); } @@ -35,10 +35,10 @@ class LocalLargeTitle extends Text { LocalLargeTitle( this.context, String translationKey, { - Color color, - List translationVariables, + Color? color, + List? translationVariables, }) : super( - AppTranslations.of(context).text(translationKey, + AppTranslations.of(context)!.text(translationKey, translationVariables: translationVariables), style: Provider.of(context).isEng ? TextStyle(color: color) @@ -48,7 +48,7 @@ class LocalLargeTitle extends Text { class TextLocalStyle extends Text { final BuildContext context; TextLocalStyle(this.context, String text, - {Color color, double fontSize, FontWeight fontWeight}) + {Color? color, double? fontSize, FontWeight? fontWeight}) : super(text, style: Provider.of(context).isEng ? TextStyle( diff --git a/lib/pages/widgets/local_title.dart b/lib/pages/widgets/local_title.dart index 8fc8c72..80397d3 100644 --- a/lib/pages/widgets/local_title.dart +++ b/lib/pages/widgets/local_title.dart @@ -4,10 +4,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class LocalTitle extends StatelessWidget { - final String textKey; - final Widget trailing; + final String? textKey; + final Widget? trailing; - const LocalTitle({Key key, this.textKey, this.trailing}) : super(key: key); + const LocalTitle({Key? key, this.textKey, this.trailing}) : super(key: key); @override Widget build(BuildContext context) { @@ -20,13 +20,13 @@ class LocalTitle extends StatelessWidget { children: [ LocalText( context, - textKey, + textKey!, fontSize: 20, fontWeight: FontWeight.bold, color: primaryColor, ), trailing != null ? Spacer() : Container(), - trailing != null ? trailing : Container() + trailing != null ? trailing! : Container() ], ), ), diff --git a/lib/pages/widgets/multi_img_controller.dart b/lib/pages/widgets/multi_img_controller.dart index 84654da..ad0be39 100644 --- a/lib/pages/widgets/multi_img_controller.dart +++ b/lib/pages/widgets/multi_img_controller.dart @@ -5,12 +5,12 @@ import 'display_image_source.dart'; class MultiImgController { List imageUrls = []; - List imageFiles = []; + List imageFiles = []; List addedFiles = []; List removedFiles = []; List fileContainers = []; - CallBack callback; + CallBack? callback; MultiImgController() { fileContainers = []; } @@ -26,7 +26,7 @@ class MultiImgController { fileContainers.add(DisplayImageSource(url: e)); }); if (callback != null) { - callback(); + callback!(); } } @@ -42,7 +42,7 @@ class MultiImgController { fileContainers.add(DisplayImageSource(file: e)); }); if (callback != null) { - callback(); + callback!(); } } @@ -54,7 +54,7 @@ class MultiImgController { // if (fileContainers.contains(fileContainer)) return; addedFiles.add(fileContainer); if (callback != null) { - callback(); + callback!(); } } @@ -74,21 +74,21 @@ class MultiImgController { } if (callback != null) { - callback(); + callback!(); } } - List get getUpdatedFile { - List _addfiles = getAddedFile; + List get getUpdatedFile { + List _addfiles = getAddedFile; this.imageFiles.addAll(_addfiles); return this.imageFiles; } - List get getAddedFile { + List get getAddedFile { return addedFiles.map((e) => e.file).toList(); } - List get getDeletedUrl { + List get getDeletedUrl { return removedFiles.map((e) => e.url).toList(); } } diff --git a/lib/pages/widgets/multi_img_file.dart b/lib/pages/widgets/multi_img_file.dart index 70d7cb4..057869b 100644 --- a/lib/pages/widgets/multi_img_file.dart +++ b/lib/pages/widgets/multi_img_file.dart @@ -8,7 +8,7 @@ import 'package:fcs/pages/widgets/show_img.dart'; import 'package:fcs/pages/widgets/show_multiple_img.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:image_picker/image_picker.dart'; @@ -18,13 +18,13 @@ import 'multi_img_controller.dart'; typedef OnFile = void Function(File); class MultiImageFile extends StatefulWidget { - final String title; + final String? title; final bool enabled; final ImageSource imageSource; - final MultiImgController controller; + final MultiImgController? controller; const MultiImageFile( - {Key key, + {Key? key, this.title, this.enabled = true, this.controller, @@ -39,10 +39,10 @@ class _MultiImageFileState extends State { @override void initState() { super.initState(); - fileContainers = widget.controller.fileContainers; - widget.controller.onChange(() { + fileContainers = widget.controller!.fileContainers; + widget.controller!.onChange(() { setState(() { - this.fileContainers = widget.controller.fileContainers; + this.fileContainers = widget.controller!.fileContainers; }); }); } @@ -133,7 +133,7 @@ class _MultiImageFileState extends State { fit: BoxFit.cover, width: 50, height: 50, - imageUrl: fileContainers[index].url, + imageUrl: fileContainers[index].url!, placeholder: (context, url) => Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, @@ -150,7 +150,7 @@ class _MultiImageFileState extends State { : FittedBox( fit: BoxFit.cover, child: Image.file( - fileContainers[index].file, + fileContainers[index].file!, ), ), ), @@ -189,13 +189,13 @@ class _MultiImageFileState extends State { fileContainer.file = selectedFile; setState(() { fileContainers.add(fileContainer); - widget.controller.addFile = fileContainer; + widget.controller!.addFile = fileContainer; }); } _fileRemove(DisplayImageSource fileContainer) { setState(() { - widget.controller.removeFile = fileContainer; + widget.controller!.removeFile = fileContainer; }); } @@ -232,11 +232,11 @@ class _MultiImageFileState extends State { context, MaterialPageRoute( builder: (context) => ShowImage( - imageFile: fileContainer.file, + imageFile: fileContainer.file!, url: fileContainer.file == null - ? fileContainer.url - : null, - fileName: widget.title)), + ? fileContainer.url! + : '', + fileName: widget.title!)), ) }, child: Chip( @@ -249,7 +249,7 @@ class _MultiImageFileState extends State { deleteIcon: Icon( Icons.close, ), - label: Text(widget.title + " - ${index + 1}"), + label: Text("${widget.title}" + " - ${index + 1}"), ), ), ), @@ -308,7 +308,7 @@ class _MultiImageFileState extends State { ); } - Widget actionIcon({OnTap onTap, Color color, IconData iconData}) { + Widget actionIcon({OnTap? onTap, Color? color, IconData? iconData}) { return InkWell( onTap: onTap, child: ClipOval( diff --git a/lib/pages/widgets/my_data_table.dart b/lib/pages/widgets/my_data_table.dart index 52932b0..f86925f 100644 --- a/lib/pages/widgets/my_data_table.dart +++ b/lib/pages/widgets/my_data_table.dart @@ -20,7 +20,7 @@ class MyDataColumn { /// /// The [label] argument must not be null. const MyDataColumn({ - @required this.label, + required this.label, this.tooltip, this.numeric = false, this.onSort, @@ -40,7 +40,7 @@ class MyDataColumn { /// This is a longer description of the column heading, for cases /// where the heading might have been abbreviated to keep the column /// width to a reasonable size. - final String tooltip; + final String? tooltip; /// Whether this column represents numeric data or not. /// @@ -53,7 +53,7 @@ class MyDataColumn { /// If null, the column will not be considered sortable. /// /// See [MyDataTable.sortColumnIndex] and [MyDataTable.sortAscending]. - final MyDataColumnSortCallback onSort; + final MyDataColumnSortCallback? onSort; bool get _debugInteractive => onSort != null; } @@ -75,7 +75,7 @@ class MyDataRow { this.key, this.selected = false, this.onSelectChanged, - @required this.cells, + required this.cells, }) : assert(cells != null); /// Creates the configuration for a row of a [MyDataTable], deriving @@ -83,12 +83,12 @@ class MyDataRow { /// /// The [cells] argument must not be null. MyDataRow.byIndex({ - int index, + int? index, this.selected = false, this.onSelectChanged, - @required this.cells, + required this.cells, }) : assert(cells != null), - key = ValueKey(index); + key = ValueKey(index!); /// A [Key] that uniquely identifies this row. This is used to /// ensure that if a row is added or removed, any stateful widgets @@ -96,7 +96,7 @@ class MyDataRow { /// remain on the right row visually. /// /// If the table never changes once created, no key is necessary. - final LocalKey key; + final LocalKey? key; /// Called when the user selects or unselects a selectable row. /// @@ -111,7 +111,7 @@ class MyDataRow { /// A row whose [onSelectChanged] callback is null is ignored for /// the purposes of determining the state of the "all" checkbox, /// and its checkbox is disabled. - final ValueChanged onSelectChanged; + final ValueChanged? onSelectChanged; /// Whether the row is selected. /// @@ -193,7 +193,7 @@ class MyDataCell { /// If non-null, tapping the cell will call this callback. If /// null, tapping the cell will attempt to select the row (if /// [MyDataRow.onSelectChanged] is provided). - final VoidCallback onTap; + final VoidCallback? onTap; bool get _debugInteractive => onTap != null; } @@ -309,8 +309,8 @@ class MyDataTable extends StatelessWidget { /// the sort order is ascending, this should be true (the default), /// otherwise it should be false. MyDataTable({ - Key key, - @required this.columns, + Key? key, + required this.columns, this.sortColumnIndex, this.sortAscending = true, this.onSelectAll, @@ -320,7 +320,7 @@ class MyDataTable extends StatelessWidget { this.columnSpacing = 56.0, this.oddLine, this.evenLine, - @required this.rows, + required this.rows, }) : assert(columns != null), assert(columns.isNotEmpty), assert(sortColumnIndex == null || @@ -339,8 +339,8 @@ class MyDataTable extends StatelessWidget { /// The configuration and labels for the columns in the table. final List columns; - final Decoration oddLine; - final Decoration evenLine; + final Decoration? oddLine; + final Decoration? evenLine; /// The current primary sort key's column. /// @@ -353,7 +353,7 @@ class MyDataTable extends StatelessWidget { /// /// When this is null, it implies that the table's sort order does /// not correspond to any of the columns. - final int sortColumnIndex; + final int? sortColumnIndex; /// Whether the column mentioned in [sortColumnIndex], if any, is sorted /// in ascending order. @@ -376,7 +376,7 @@ class MyDataTable extends StatelessWidget { /// To control whether a particular row is selectable or not, see /// [MyDataRow.onSelectChanged]. This callback is only relevant if any /// row is selectable. - final ValueSetter onSelectAll; + final ValueSetter? onSelectAll; /// The height of each row (excluding the row that contains column headings). /// @@ -413,11 +413,10 @@ class MyDataTable extends StatelessWidget { // non-numeric, if there is exactly one, otherwise null. final int _onlyTextColumn; static int _initOnlyTextColumn(List columns) { - int result; + int result = 0; for (int index = 0; index < columns.length; index += 1) { final MyDataColumn column = columns[index]; if (!column.numeric) { - if (result != null) return null; result = index; } } @@ -433,11 +432,11 @@ class MyDataTable extends StatelessWidget { void _handleSelectAll(bool checked) { if (onSelectAll != null) { - onSelectAll(checked); + onSelectAll!(checked); } else { for (MyDataRow row in rows) { if ((row.onSelectChanged != null) && (row.selected != checked)) - row.onSelectChanged(checked); + row.onSelectChanged!(checked); } } } @@ -452,10 +451,10 @@ class MyDataTable extends StatelessWidget { Color(0x1E000000); // Dark theme variant is just a guess. Widget _buildCheckbox({ - Color color, - bool checked, - VoidCallback onRowTap, - ValueChanged onCheckboxChanged, + Color? color, + bool? checked, + VoidCallback? onRowTap, + ValueChanged? onCheckboxChanged, }) { Widget contents = Semantics( container: true, @@ -466,7 +465,9 @@ class MyDataTable extends StatelessWidget { child: Checkbox( activeColor: color, value: checked, - onChanged: onCheckboxChanged, + onChanged: (bool? value) { + onCheckboxChanged!(value ?? false); + }, ), ), ), @@ -484,32 +485,33 @@ class MyDataTable extends StatelessWidget { } Widget _buildHeadingCell({ - BuildContext context, - EdgeInsetsGeometry padding, - Widget label, - String tooltip, - bool numeric, - VoidCallback onSort, - bool sorted, - bool ascending, + required BuildContext context, + EdgeInsetsGeometry? padding, + Widget? label, + String? tooltip, + bool? numeric, + VoidCallback? onSort, + bool? sorted, + bool? ascending, }) { if (onSort != null) { final Widget arrow = _SortArrow( - visible: sorted, + visible: sorted!, down: sorted ? ascending : null, duration: _sortArrowAnimationDuration, ); const Widget arrowPadding = SizedBox(width: _sortArrowPadding); label = Row( - textDirection: numeric ? TextDirection.rtl : null, - children: [label, arrowPadding, arrow], + textDirection: (numeric ?? false) ? TextDirection.rtl : null, + children: [label ?? Container(), arrowPadding, arrow], ); } label = Container( padding: padding, height: headingRowHeight, - alignment: - numeric ? Alignment.centerRight : AlignmentDirectional.centerStart, + alignment: (numeric ?? false) + ? Alignment.centerRight + : AlignmentDirectional.centerStart, child: AnimatedDefaultTextStyle( style: TextStyle( // TODO(ianh): font family should match Theme; see https://github.com/flutter/flutter/issues/3116 @@ -517,12 +519,16 @@ class MyDataTable extends StatelessWidget { fontSize: _headingFontSize, height: math.min(1.0, headingRowHeight / _headingFontSize), color: (Theme.of(context).brightness == Brightness.light) - ? ((onSort != null && sorted) ? Colors.black87 : Colors.black54) - : ((onSort != null && sorted) ? Colors.white : Colors.white70), + ? ((onSort != null && (sorted ?? false)) + ? Colors.black87 + : Colors.black54) + : ((onSort != null && (sorted ?? false)) + ? Colors.white + : Colors.white70), ), softWrap: false, duration: _sortArrowAnimationDuration, - child: label, + child: label ?? Container(), ), ); if (tooltip != null) { @@ -541,42 +547,43 @@ class MyDataTable extends StatelessWidget { } Widget _buildMyDataCell({ - BuildContext context, - EdgeInsetsGeometry padding, - Widget label, - bool numeric, - bool placeholder, - bool showEditIcon, - VoidCallback onTap, - VoidCallback onSelectChanged, + required BuildContext context, + EdgeInsetsGeometry? padding, + Widget? label, + bool? numeric, + bool? placeholder, + bool? showEditIcon, + VoidCallback? onTap, + VoidCallback? onSelectChanged, }) { final bool isLightTheme = Theme.of(context).brightness == Brightness.light; - if (showEditIcon) { + if (showEditIcon ?? false) { const Widget icon = Icon(Icons.edit, size: 18.0); - label = Expanded(child: label); + label = Expanded(child: label ?? Container()); label = Row( - textDirection: numeric ? TextDirection.rtl : null, + textDirection: (numeric ?? false) ? TextDirection.rtl : null, children: [label, icon], ); } label = Container( padding: padding, height: MyDataRowHeight, - alignment: - numeric ? Alignment.centerRight : AlignmentDirectional.centerStart, + alignment: (numeric ?? false) + ? Alignment.centerRight + : AlignmentDirectional.centerStart, child: DefaultTextStyle( style: TextStyle( // TODO(ianh): font family should be Roboto; see https://github.com/flutter/flutter/issues/3116 fontSize: 13.0, color: isLightTheme - ? (placeholder ? Colors.black38 : Colors.black87) - : (placeholder ? Colors.white38 : Colors.white70), + ? ((placeholder ?? false) ? Colors.black38 : Colors.black87) + : ((placeholder ?? false) ? Colors.white38 : Colors.white70), ), child: IconTheme.merge( data: IconThemeData( color: isLightTheme ? Colors.black54 : Colors.white70, ), - child: DropdownButtonHideUnderline(child: label), + child: DropdownButtonHideUnderline(child: label ?? Container()), ), ), ); @@ -613,8 +620,9 @@ class MyDataTable extends StatelessWidget { final bool showCheckboxColumn = false; final bool allChecked = false; - final List tableColumns = - List(columns.length + (showCheckboxColumn ? 1 : 0)); + final List tableColumns = (columns.length + + (showCheckboxColumn ? 1 : 0)) as List; + final List tableRows = List.generate( rows.length + 1, // the +1 is for the header row (int index) { @@ -627,36 +635,36 @@ class MyDataTable extends StatelessWidget { : index.isEven && evenLine != null ? evenLine : _kUnselectedDecoration, - children: List(tableColumns.length), + children: tableColumns.map((e) => Container()).toList(), ); }, ); int rowIndex; - int displayColumnIndex = 0; - if (showCheckboxColumn) { - tableColumns[0] = FixedColumnWidth( - horizontalMargin + Checkbox.width + horizontalMargin / 2.0); - tableRows[0].children[0] = _buildCheckbox( - color: theme.accentColor, - checked: allChecked, - onCheckboxChanged: _handleSelectAll, - ); - rowIndex = 1; - for (MyDataRow row in rows) { - tableRows[rowIndex].children[0] = _buildCheckbox( - color: theme.accentColor, - checked: row.selected, - onRowTap: () => row.onSelectChanged != null - ? row.onSelectChanged(!row.selected) - : null, - onCheckboxChanged: row.onSelectChanged, - ); - rowIndex += 1; - } - displayColumnIndex += 1; - } + int displayColumnIndex = 0; + // if (showCheckboxColumn) { + // tableColumns[0] = FixedColumnWidth( + // horizontalMargin + Checkbox.width + horizontalMargin / 2.0); + // tableRows[0].children![0] = _buildCheckbox( + // color: theme.accentColor, + // checked: allChecked, + // onCheckboxChanged: _handleSelectAll, + // ); + // rowIndex = 1; + // for (MyDataRow row in rows) { + // tableRows[rowIndex].children[0] = _buildCheckbox( + // color: theme.accentColor, + // checked: row.selected, + // onRowTap: () => row.onSelectChanged != null + // ? row.onSelectChanged(!row.selected) + // : null, + // onCheckboxChanged: row.onSelectChanged, + // ); + // rowIndex += 1; + // } + // displayColumnIndex += 1; + // } for (int MyDataColumnIndex = 0; MyDataColumnIndex < columns.length; @@ -689,14 +697,14 @@ class MyDataTable extends StatelessWidget { } else { tableColumns[displayColumnIndex] = const IntrinsicColumnWidth(); } - tableRows[0].children[displayColumnIndex] = _buildHeadingCell( + tableRows[0].children![displayColumnIndex] = _buildHeadingCell( context: context, padding: padding, label: column.label, tooltip: column.tooltip, numeric: column.numeric, onSort: () => column.onSort != null - ? column.onSort(MyDataColumnIndex, + ? column.onSort!(MyDataColumnIndex, sortColumnIndex != MyDataColumnIndex || !sortAscending) : null, sorted: MyDataColumnIndex == sortColumnIndex, @@ -705,7 +713,7 @@ class MyDataTable extends StatelessWidget { rowIndex = 1; for (MyDataRow row in rows) { final MyDataCell cell = row.cells[MyDataColumnIndex]; - tableRows[rowIndex].children[displayColumnIndex] = _buildMyDataCell( + tableRows[rowIndex].children?[displayColumnIndex] = _buildMyDataCell( context: context, padding: padding, label: cell.child, @@ -714,7 +722,7 @@ class MyDataTable extends StatelessWidget { showEditIcon: cell.showEditIcon, onTap: cell.onTap, onSelectChanged: () => row.onSelectChanged != null - ? row.onSelectChanged(!row.selected) + ? row.onSelectChanged!(!row.selected) : null, ); rowIndex += 1; @@ -745,12 +753,12 @@ class MyDataTable extends StatelessWidget { class TableRowInkWell extends InkResponse { /// Creates an ink well for a table row. const TableRowInkWell({ - Key key, - Widget child, - GestureTapCallback onTap, - GestureTapCallback onDoubleTap, - GestureLongPressCallback onLongPress, - ValueChanged onHighlightChanged, + Key? key, + Widget? child, + GestureTapCallback? onTap, + GestureTapCallback? onDoubleTap, + GestureLongPressCallback? onLongPress, + ValueChanged? onHighlightChanged, }) : super( key: key, child: child, @@ -766,7 +774,7 @@ class TableRowInkWell extends InkResponse { RectCallback getRectCallback(RenderBox referenceBox) { return () { RenderObject cell = referenceBox; - AbstractNode table = cell.parent; + AbstractNode? table = cell.parent; final Matrix4 transform = Matrix4.identity(); while (table is RenderObject && table is! RenderTable) { final RenderObject parentBox = table as RenderObject; @@ -779,11 +787,11 @@ class TableRowInkWell extends InkResponse { final TableCellParentData cellParentData = cell.parentData as TableCellParentData; assert(cellParentData.y != null); - final Rect rect = table.getRowBox(cellParentData.y); + final Rect rect = table.getRowBox(cellParentData.y!); // The rect is in the table's coordinate space. We need to change it to the // TableRowInkWell's coordinate space. table.applyPaintTransform(cell, transform); - final Offset offset = MatrixUtils.getAsTranslation(transform); + final Offset? offset = MatrixUtils.getAsTranslation(transform); if (offset != null) return rect.shift(-offset); } return Rect.zero; @@ -799,31 +807,31 @@ class TableRowInkWell extends InkResponse { class _SortArrow extends StatefulWidget { const _SortArrow({ - Key key, + Key? key, this.visible, this.down, this.duration, }) : super(key: key); - final bool visible; + final bool? visible; - final bool down; + final bool? down; - final Duration duration; + final Duration? duration; @override _SortArrowState createState() => _SortArrowState(); } class _SortArrowState extends State<_SortArrow> with TickerProviderStateMixin { - AnimationController _opacityController; - Animation _opacityAnimation; + AnimationController? _opacityController; + Animation? _opacityAnimation; - AnimationController _orientationController; - Animation _orientationAnimation; + AnimationController? _orientationController; + Animation? _orientationAnimation; double _orientationOffset = 0.0; - bool _down; + bool? _down; static final Animatable _turnTween = Tween(begin: 0.0, end: math.pi) @@ -839,15 +847,16 @@ class _SortArrowState extends State<_SortArrow> with TickerProviderStateMixin { ), curve: Curves.fastOutSlowIn, )..addListener(_rebuild); - _opacityController.value = widget.visible ? 1.0 : 0.0; + _opacityController!.value = (widget.visible ?? false) ? 1.0 : 0.0; _orientationController = AnimationController( duration: widget.duration, vsync: this, ); - _orientationAnimation = _orientationController.drive(_turnTween) + _orientationAnimation = _orientationController!.drive(_turnTween) ..addListener(_rebuild) ..addStatusListener(_resetOrientationAnimation); - if (widget.visible) _orientationOffset = widget.down ? 0.0 : math.pi; + if (widget.visible ?? false) + _orientationOffset = (widget.down ?? false) ? 0.0 : math.pi; } void _rebuild() { @@ -858,9 +867,9 @@ class _SortArrowState extends State<_SortArrow> with TickerProviderStateMixin { void _resetOrientationAnimation(AnimationStatus status) { if (status == AnimationStatus.completed) { - assert(_orientationAnimation.value == math.pi); + assert(_orientationAnimation!.value == math.pi); _orientationOffset += math.pi; - _orientationController.value = + _orientationController!.value = 0.0; // TODO(ianh): This triggers a pointless rebuild. } } @@ -869,26 +878,26 @@ class _SortArrowState extends State<_SortArrow> with TickerProviderStateMixin { void didUpdateWidget(_SortArrow oldWidget) { super.didUpdateWidget(oldWidget); bool skipArrow = false; - final bool newDown = widget.down ?? _down; + final bool newDown = widget.down ?? _down!; if (oldWidget.visible != widget.visible) { - if (widget.visible && - (_opacityController.status == AnimationStatus.dismissed)) { - _orientationController.stop(); - _orientationController.value = 0.0; + if (widget.visible! && + (_opacityController!.status == AnimationStatus.dismissed)) { + _orientationController!.stop(); + _orientationController!.value = 0.0; _orientationOffset = newDown ? 0.0 : math.pi; skipArrow = true; } - if (widget.visible) { - _opacityController.forward(); + if ((widget.visible ?? false)) { + _opacityController!.forward(); } else { - _opacityController.reverse(); + _opacityController!.reverse(); } } if ((_down != newDown) && !skipArrow) { - if (_orientationController.status == AnimationStatus.dismissed) { - _orientationController.forward(); + if (_orientationController!.status == AnimationStatus.dismissed) { + _orientationController?.forward(); } else { - _orientationController.reverse(); + _orientationController?.reverse(); } } _down = newDown; @@ -896,8 +905,8 @@ class _SortArrowState extends State<_SortArrow> with TickerProviderStateMixin { @override void dispose() { - _opacityController.dispose(); - _orientationController.dispose(); + _opacityController?.dispose(); + _orientationController?.dispose(); super.dispose(); } @@ -907,10 +916,10 @@ class _SortArrowState extends State<_SortArrow> with TickerProviderStateMixin { @override Widget build(BuildContext context) { return Opacity( - opacity: _opacityAnimation.value, + opacity: _opacityAnimation!.value, child: Transform( transform: - Matrix4.rotationZ(_orientationOffset + _orientationAnimation.value) + Matrix4.rotationZ(_orientationOffset + _orientationAnimation!.value) ..setTranslationRaw(0.0, _arrowIconBaselineOffset, 0.0), alignment: Alignment.center, child: Icon( diff --git a/lib/pages/widgets/number_cell.dart b/lib/pages/widgets/number_cell.dart index ec3efeb..9ec16c2 100644 --- a/lib/pages/widgets/number_cell.dart +++ b/lib/pages/widgets/number_cell.dart @@ -5,9 +5,9 @@ import 'package:fcs/helpers/theme.dart' as theme; class NumberCell extends StatelessWidget { final int number; final numberFormatter; - final TextStyle textStyle; + final TextStyle? textStyle; - NumberCell(this.number, {Key key, this.textStyle}) + NumberCell(this.number, {Key? key, this.textStyle}) : numberFormatter = new NumberFormat("#,###"), super(key: key); diff --git a/lib/pages/widgets/offline_redirect.dart b/lib/pages/widgets/offline_redirect.dart index 9e4609d..df7ec32 100644 --- a/lib/pages/widgets/offline_redirect.dart +++ b/lib/pages/widgets/offline_redirect.dart @@ -6,14 +6,14 @@ import 'package:provider/provider.dart'; class OfflineRedirect extends StatefulWidget { final Widget child; - OfflineRedirect({@required this.child}); + OfflineRedirect({required this.child}); @override _OfflineRedirectState createState() => _OfflineRedirectState(); } class _OfflineRedirectState extends State { - Timer offlineTimer; + Timer? offlineTimer; @override void initState() { @@ -27,7 +27,7 @@ class _OfflineRedirectState extends State { } _startOfflineTimer() async { - if (offlineTimer != null && offlineTimer.isActive) return; + if (offlineTimer != null && offlineTimer!.isActive) return; var _duration = new Duration(milliseconds: 500); this.offlineTimer = new Timer.periodic(_duration, offlineNav); } @@ -41,7 +41,7 @@ class _OfflineRedirectState extends State { } void dispose() { - offlineTimer.cancel(); + offlineTimer!.cancel(); super.dispose(); } diff --git a/lib/pages/widgets/pdf_screen.dart b/lib/pages/widgets/pdf_screen.dart index e9a1397..d0490c3 100644 --- a/lib/pages/widgets/pdf_screen.dart +++ b/lib/pages/widgets/pdf_screen.dart @@ -11,10 +11,10 @@ import 'package:flutter_pdfview/flutter_pdfview.dart'; import 'package:share/share.dart'; class PDFScreen extends StatefulWidget { - final String title; - final String url; + final String? title; + final String? url; - PDFScreen({Key key, this.url, this.title}) : super(key: key); + PDFScreen({Key? key, this.url, this.title}) : super(key: key); _PDFScreenState createState() => _PDFScreenState(); } @@ -33,10 +33,10 @@ class _PDFScreenState extends State with WidgetsBindingObserver { download(); } - File file; + File? file; Future download() async { try { - File f = await PdfCacheMgr.pdfs.getSingleFile(widget.url); + File f = await PdfCacheMgr.pdfs.getSingleFile(widget.url!); setState(() { file = f; }); @@ -89,23 +89,23 @@ class _PDFScreenState extends State with WidgetsBindingObserver { fitPolicy: FitPolicy.BOTH, preventLinkNavigation: false, // if set to true the link is handled in flutter - onRender: (_pages) { + onRender: (int?_pages) { print(('pages => $pages')); setState(() { - pages = _pages; + pages = _pages!; isReady = true; }); }, onViewCreated: (PDFViewController pdfViewController) { _controller.complete(pdfViewController); }, - onLinkHandler: (String uri) { + onLinkHandler: (String? uri) { print('goto uri: $uri'); }, - onPageChanged: (int page, int total) { + onPageChanged: (int? page, int? total) { print('page change: $page/$total'); setState(() { - currentPage = page; + currentPage = page!; }); }, ), @@ -116,8 +116,8 @@ class _PDFScreenState extends State with WidgetsBindingObserver { } _share() async { - final RenderBox box = context.findRenderObject(); - await Share.shareFiles([file.path], + final RenderBox box = context.findRenderObject() as RenderBox; + await Share.shareFiles([file!.path], mimeTypes: ["application/pdf"], subject: "File", sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); diff --git a/lib/pages/widgets/popupmenu.dart b/lib/pages/widgets/popupmenu.dart index 3587571..d4092f9 100644 --- a/lib/pages/widgets/popupmenu.dart +++ b/lib/pages/widgets/popupmenu.dart @@ -1,7 +1,7 @@ class PopupMenu { int id; String status; - PopupMenu({this.id, this.status}); + PopupMenu({required this.id, required this.status}); } List menuPopup = [ diff --git a/lib/pages/widgets/progress.dart b/lib/pages/widgets/progress.dart index 9608049..df0c18d 100644 --- a/lib/pages/widgets/progress.dart +++ b/lib/pages/widgets/progress.dart @@ -4,7 +4,7 @@ import 'package:provider/provider.dart'; import 'package:fcs/helpers/theme.dart'; class LocalProgress extends Progress { - LocalProgress({bool inAsyncCall, Widget child}) + LocalProgress({required bool inAsyncCall, required Widget child}) : super( inAsyncCall: inAsyncCall, child: child, diff --git a/lib/pages/widgets/show_img.dart b/lib/pages/widgets/show_img.dart index 130cdad..191096a 100644 --- a/lib/pages/widgets/show_img.dart +++ b/lib/pages/widgets/show_img.dart @@ -6,12 +6,12 @@ import 'package:flutter/material.dart'; import 'package:photo_view/photo_view.dart'; class ShowImage extends StatefulWidget { - final String url; - final File imageFile; - final String fileName; - final String localImage; + final String? url; + final File? imageFile; + final String? fileName; + final String? localImage; const ShowImage( - {Key key, this.imageFile, this.fileName, this.url, this.localImage}) + {Key? key, this.imageFile, this.fileName, this.url, this.localImage}) : super(key: key); @override _ShowImageState createState() => _ShowImageState(); @@ -20,6 +20,13 @@ class ShowImage extends StatefulWidget { class _ShowImageState extends State { @override Widget build(BuildContext context) { + final ImageProvider? p; + if (widget.imageFile != null) { + p = FileImage(widget.imageFile!); + } else { + p = AssetImage(widget.localImage!); + } + return Scaffold( appBar: AppBar( leading: new IconButton( @@ -35,11 +42,7 @@ class _ShowImageState extends State { backgroundDecoration: const BoxDecoration( color: primaryColor, ), - imageProvider: widget.url != null - ? NetworkImage(widget.url) - : widget.imageFile != null - ? FileImage(widget.imageFile) - : AssetImage(widget.localImage), + imageProvider: widget.url != null ? NetworkImage(widget.url!) : p, minScale: PhotoViewComputedScale.contained * 1)), ); } diff --git a/lib/pages/widgets/show_multiple_img.dart b/lib/pages/widgets/show_multiple_img.dart index f94e81d..17e0821 100644 --- a/lib/pages/widgets/show_multiple_img.dart +++ b/lib/pages/widgets/show_multiple_img.dart @@ -8,14 +8,14 @@ class ShowMultiImage extends StatefulWidget { final List displayImageSources; final int initialPage; const ShowMultiImage( - {Key key, this.displayImageSources, this.initialPage = 0}) + {Key? key, required this.displayImageSources, this.initialPage = 0}) : super(key: key); @override _ShowMultiImageState createState() => _ShowMultiImageState(); } class _ShowMultiImageState extends State { - PageController pageController; + late PageController pageController; @override void initState() { pageController = PageController(initialPage: widget.initialPage); @@ -58,7 +58,7 @@ class _ShowMultiImageState extends State { value: event == null ? 0 : event.cumulativeBytesLoaded / - event.expectedTotalBytes, + event.expectedTotalBytes!, ), ), ), diff --git a/lib/pages/widgets/status_tree.dart b/lib/pages/widgets/status_tree.dart index 27e2e49..a01cb7e 100644 --- a/lib/pages/widgets/status_tree.dart +++ b/lib/pages/widgets/status_tree.dart @@ -4,7 +4,7 @@ import 'package:fcs/domain/vo/shipment_status.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:timeline_list/timeline.dart'; import 'package:timeline_list/timeline_model.dart'; @@ -12,10 +12,10 @@ import 'package:timeline_list/timeline_model.dart'; var dateFormatter = new DateFormat('dd MMM yyyy'); class StatusTree extends StatelessWidget { - final List shipmentHistory; - final String currentStatus; + final List? shipmentHistory; + final String? currentStatus; - const StatusTree({Key key, this.shipmentHistory, this.currentStatus}) + const StatusTree({Key? key, this.shipmentHistory, this.currentStatus}) : super(key: key); @override Widget build(BuildContext context) { @@ -39,7 +39,7 @@ class StatusTree extends StatelessWidget { if (shipmentHistory == null || currentStatus == null) return []; bool isPacked = currentStatus != package_received_status && currentStatus != package_processed_status; - return shipmentHistory + return shipmentHistory! .map((e) => TimelineModel( Padding( padding: const EdgeInsets.all(18.0), @@ -48,17 +48,17 @@ class StatusTree extends StatelessWidget { children: [ Text(e.status, style: TextStyle( - color: e.done ? primaryColor : Colors.grey, + color: e.done! ? primaryColor : Colors.grey, fontSize: 16, fontWeight: FontWeight.bold)), - e.done || isPacked + e.done! || isPacked ? Text(dateFormatter.format(e.date)) : Container(), - e.staffName == null ? Container() : Text(e.staffName) + e.staffName == null ? Container() : Text(e.staffName!) ], ), ), - iconBackground: e.done ? primaryColor : Colors.grey, + iconBackground: e.done! ? primaryColor : Colors.grey, icon: Icon( e.status == "shipped" ? Ionicons.ios_airplane diff --git a/lib/pages/widgets/task_button.dart b/lib/pages/widgets/task_button.dart index 5ad828c..638cc91 100644 --- a/lib/pages/widgets/task_button.dart +++ b/lib/pages/widgets/task_button.dart @@ -9,11 +9,11 @@ typedef BtnCallback(); /// TaskButton is used to navigate to eash task class TaskButton extends StatelessWidget { - final String titleKey; - final IconData icon; - final BtnCallback btnCallback; + final String? titleKey; + final IconData? icon; + final BtnCallback? btnCallback; - const TaskButton(this.titleKey, {Key key, this.icon, this.btnCallback}) + const TaskButton(this.titleKey, {Key? key, this.icon, this.btnCallback}) : super(key: key); @override @@ -45,7 +45,7 @@ class TaskButton extends StatelessWidget { Container( height: 45, alignment: Alignment.topCenter, - child: Text(AppTranslations.of(context).text(titleKey), + child: Text(AppTranslations.of(context)!.text(titleKey!), textAlign: TextAlign.center, style: languageModel.isEng ? TextStyle( diff --git a/lib/pages/widgets/title_with_add_button.dart b/lib/pages/widgets/title_with_add_button.dart index c006f35..e988f4e 100644 --- a/lib/pages/widgets/title_with_add_button.dart +++ b/lib/pages/widgets/title_with_add_button.dart @@ -6,11 +6,11 @@ import 'package:flutter/material.dart'; import 'callbacks.dart'; class TitleWithAddButton extends StatelessWidget { - final IconData iconData; - final String titleKey; - final OnTap onTap; + final IconData? iconData; + final String? titleKey; + final OnTap? onTap; - const TitleWithAddButton({Key key, this.iconData, this.titleKey, this.onTap}) + const TitleWithAddButton({Key? key, this.iconData, this.titleKey, this.onTap}) : super(key: key); @override @@ -28,7 +28,7 @@ class TitleWithAddButton extends StatelessWidget { ), LocalText( context, - titleKey, + titleKey!, color: Colors.black54, fontSize: 20, ) @@ -40,7 +40,7 @@ class TitleWithAddButton extends StatelessWidget { : Padding( padding: const EdgeInsets.only(right: 0), child: IconButton( - onPressed: () => onTap(), + onPressed: () => onTap!(), icon: Icon( Icons.add_circle, color: primaryColor, diff --git a/pubspec.lock b/pubspec.lock index a551a79..2901b05 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -112,21 +112,21 @@ packages: name: cloud_firestore url: "https://pub.dartlang.org" source: hosted - version: "2.5.0" + version: "2.5.2" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "5.4.0" + version: "5.4.1" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.2" collection: dependency: transitive description: @@ -280,7 +280,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.6.0" firebase_core_platform_interface: dependency: transitive description: @@ -349,6 +349,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.5.1" + flutter_icons_null_safety: + dependency: "direct main" + description: + name: flutter_icons_null_safety + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "8.2.0" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.1" flutter_localizations: dependency: "direct main" description: flutter @@ -373,6 +394,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_vector_icons: + dependency: "direct main" + description: + name: flutter_vector_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" flutter_web_plugins: dependency: transitive description: flutter @@ -866,6 +894,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.5" + timezone: + dependency: transitive + description: + name: timezone + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.0" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 6d589fb..e60aa6c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: cupertino_icons: ^1.0.3 firebase_core: ^1.5.0 - cloud_firestore: ^2.5.0 + cloud_firestore: ^2.5.2 firebase_storage: ^10.0.2 firebase_auth: "^3.0.2" # firebase_messaging: ^6.0.15 @@ -43,16 +43,16 @@ dependencies: permission_handler: ^8.1.4+2 country_code_picker: ^2.0.2 pin_input_text_field: ^4.1.0 - # flutter_icons: ^1.1.0 + flutter_icons_null_safety: ^1.1.0 country_icons: ^2.0.2 timeline_list: ^0.0.5 - # barcode_scan: ^2.0.2 barcode_scan2: ^4.1.4 flutter_pdfview: ^1.2.1 - # flutter_local_notifications: ^8.1.1+1 + flutter_local_notifications: ^8.2.0 share: ^2.0.4 cached_network_image: ^3.1.0 flutter_cache_manager: ^3.1.2 + flutter_vector_icons: ^1.0.0 dev_dependencies: flutter_test: