migrate initial

migrate_to_ns
error500 2022-01-25 13:42:34 +06:00
parent 12040f4c2a
commit 875f930da4
78 changed files with 843 additions and 995 deletions

View File

@ -3,9 +3,9 @@ import 'package:logger/logger.dart';
import '../logger.dart'; import '../logger.dart';
class BaseService { class BaseService {
Logger log; late Logger log;
BaseService({String title}) { BaseService({String? title}) {
this.log = getLogger( this.log = getLogger(
title ?? this.runtimeType.toString(), title ?? this.runtimeType.toString(),
); );

View File

@ -5,10 +5,10 @@ const String Category_columnName = 'name';
const String Category_columnAppCompanyId = 'app_company_id'; const String Category_columnAppCompanyId = 'app_company_id';
class Category { class Category {
int id; int? id;
int parentIn; int? parentIn;
String name; String name = '';
int appCompanyId; int? appCompanyId;
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
var map = <String, dynamic>{ var map = <String, dynamic>{

View File

@ -13,17 +13,17 @@ const String Goog_columnOkei = 'okei';
const String Goog_columnDiscount = 'discount'; const String Goog_columnDiscount = 'discount';
class Good { class Good {
int id; int? id;
int articul; int articul = -1;
String name; String name = '';
double price; double price = -1;
int categoryId; int categoryId = -1;
String ean; String? ean;
int appCompanyId; int? appCompanyId;
String description; String? description;
double showPrice; double? showPrice;
int okei; int? okei;
double discount; double? discount;
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
var map = <String, dynamic>{ var map = <String, dynamic>{

View File

@ -14,16 +14,15 @@ const String Service_columnDiscount = 'discount';
class Service { class Service {
int id; int? id;
int articul; int articul = -1;
String name; String name = '';
double price; double price = -1;
String ean; int? appCompanyId;
int appCompanyId; String? description;
String description; double? showPrice;
double showPrice; String? okei;
String okei; double? discount;
double discount;
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
var map = <String, dynamic>{ var map = <String, dynamic>{

View File

@ -16,16 +16,16 @@ const String VoucherTypeReturnPay = 'returnPay';
const String VoucherTypeReport = 'report'; const String VoucherTypeReport = 'report';
class Voucher { class Voucher {
int id; int? id;
String name; String? name;
double total; double? total;
String data; String? data;
String base64Data; String? base64Data;
DateTime dateTime; DateTime? dateTime;
int appCompanyId; int? appCompanyId;
int kassaId; int? kassaId;
String type; String? type;
String url; String? url;
Voucher(); Voucher();
@ -35,7 +35,7 @@ class Voucher {
Voucher_columnTotal: total, Voucher_columnTotal: total,
Voucher_columnData: data, Voucher_columnData: data,
Voucher_columnBase64Data: base64Data, Voucher_columnBase64Data: base64Data,
Voucher_columnDateTime: dateTime.toIso8601String(), Voucher_columnDateTime: dateTime?.toIso8601String(),
Voucher_columnKassaId: kassaId, Voucher_columnKassaId: kassaId,
Voucher_columnAppCompanyId: appCompanyId, Voucher_columnAppCompanyId: appCompanyId,
Voucher_columnType: type, Voucher_columnType: type,
@ -47,7 +47,7 @@ class Voucher {
return map; return map;
} }
Voucher.fromMap(Map<String, dynamic> map) { Voucher.fromMap(Map<dynamic, dynamic> map) {
id = map[Voucher_columnId]; id = map[Voucher_columnId];
name = map[Voucher_columnName]; name = map[Voucher_columnName];
total = map[Voucher_columnTotal]?.toDouble(); total = map[Voucher_columnTotal]?.toDouble();

View File

@ -14,13 +14,13 @@ class SimpleLogPrinter extends LogPrinter {
var error = event.error?.toString() ?? ''; var error = event.error?.toString() ?? '';
var color = PrettyPrinter.levelColors[level]; var color = PrettyPrinter.levelColors[level];
var emoji = PrettyPrinter.levelEmojis[level]; var emoji = PrettyPrinter.levelEmojis[level];
String stack; String? stack;
if (event.stackTrace == null) { if (event.stackTrace == null) {
stack = formatStackTrace(StackTrace.current, 2); stack = formatStackTrace(StackTrace.current, 2);
} else { } else {
stack = formatStackTrace(event.stackTrace, 1); stack = formatStackTrace(event.stackTrace!, 1);
} }
print(color(' $emoji $message $error -> $stack ')); print(color!(' $emoji $message $error -> $stack '));
return []; return [];
} }
@ -33,9 +33,9 @@ class SimpleLogPrinter extends LogPrinter {
} }
} }
String formatStackTrace(StackTrace stackTrace, int methodPosition) { String? formatStackTrace(StackTrace stackTrace, int methodPosition) {
var lines = stackTrace.toString()?.split('\n'); var lines = stackTrace.toString().split('\n');
var formatted = <String>[]; var formatted = <String>[];
var count = 0; var count = 0;
for (var line in lines) { for (var line in lines) {
@ -62,7 +62,7 @@ class SimpleLogPrinter extends LogPrinter {
if (match == null) { if (match == null) {
return false; return false;
} }
return match.group(2).startsWith('package:logger'); return match.group(2)!.startsWith('package:logger');
} }
bool _discardWebStacktraceLine(String line) { bool _discardWebStacktraceLine(String line) {
@ -70,8 +70,8 @@ class SimpleLogPrinter extends LogPrinter {
if (match == null) { if (match == null) {
return false; return false;
} }
return match.group(1).startsWith('packages/logger') || return match.group(1)!.startsWith('packages/logger') ||
match.group(1).startsWith('dart-sdk/lib'); match.group(1)!.startsWith('dart-sdk/lib');
} }
} }

View File

@ -2,9 +2,9 @@ import '../utilsParse.dart';
import 'user.dart'; import 'user.dart';
class AuthResponse { class AuthResponse {
final AuthBody body; final AuthBody? body;
final int status; final int? status;
final bool operation; final bool? operation;
AuthResponse( {this.body, this.status, this.operation}); AuthResponse( {this.body, this.status, this.operation});
@ -19,10 +19,10 @@ class AuthResponse {
} }
class AuthBody { class AuthBody {
final List<String> email; final List<String>? email;
final List<String> password; final List<String>? password;
final String message; final String? message;
final User user; final User? user;
AuthBody({this.message, this.user, this.email, this.password}); AuthBody({this.message, this.user, this.email, this.password});
factory AuthBody.fromJson(Map<String, dynamic> json) { factory AuthBody.fromJson(Map<String, dynamic> json) {
return AuthBody( return AuthBody(

View File

@ -1,9 +1,9 @@
class CalcModel { class CalcModel {
String num1; String num1;
String num2; String? num2;
bool closed; bool closed;
String operation; String operation;
CalcModel({this.num1, this.num2, this.operation, this.closed = false}); CalcModel({required this.num1, this.num2, required this.operation, this.closed = false});
@override @override
String toString() { String toString() {

View File

@ -1,9 +1,9 @@
import 'package:aman_kassa_flutter/core/models/check_item.dart'; import 'package:aman_kassa_flutter/core/models/check_item.dart';
class CheckData { class CheckData {
final String type; final String ?type;
num card; num? card;
final List<CheckItem> items; final List<CheckItem>? items;
CheckData({this.type, this.card, this.items}); CheckData({this.type, this.card, this.items});
static CheckData fromJson(Map<String, dynamic> json) { static CheckData fromJson(Map<String, dynamic> json) {
@ -17,6 +17,6 @@ class CheckData {
{ {
'type': type, 'type': type,
'card': card, 'card': card,
'items': items.map((e) => e.toJson()).toList() 'items': items?.map((e) => e.toJson()).toList()
}; };
} }

View File

@ -1,6 +1,6 @@
class CheckImageModal { class CheckImageModal {
final String base64Data; final String? base64Data;
final String textData; final String? textData;
CheckImageModal({this.base64Data, this.textData}); CheckImageModal({this.base64Data, this.textData});
static CheckImageModal fromJson(Map<String, dynamic> json) { static CheckImageModal fromJson(Map<String, dynamic> json) {

View File

@ -3,8 +3,8 @@ class CheckItem {
final num cnt; final num cnt;
final num price; final num price;
final int articul; final int articul;
final String excise; final String? excise;
CheckItem({this.name, this.cnt, this.price, this.articul, this.excise}); CheckItem({required this.name, required this.cnt, required this.price, required this.articul, this.excise});
static CheckItem fromJson(Map<String, dynamic> json) { static CheckItem fromJson(Map<String, dynamic> json) {
return CheckItem( return CheckItem(

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class Choice { class Choice {
const Choice({this.title, this.icon, this.command}); const Choice({required this.title, required this.icon, required this.command});
final String command; final String command;
final String title; final String title;
final IconData icon; final IconData icon;

View File

@ -4,13 +4,13 @@ class DialogRequest {
final String title; final String title;
final String description; final String description;
final String buttonTitle; final String buttonTitle;
final String cancelTitle; final String? cancelTitle;
final String formatType; final String? formatType;
DialogRequest( DialogRequest(
{@required this.title, {required this.title,
@required this.description, required this.description,
@required this.buttonTitle, required this.buttonTitle,
this.cancelTitle, this.cancelTitle,
this.formatType}); this.formatType});
} }
@ -18,13 +18,13 @@ class DialogRequest {
class DialogResponse { class DialogResponse {
//final String fieldOne; //final String fieldOne;
//final String fieldTwo; //final String fieldTwo;
final String responseText; final String? responseText;
final bool confirmed; final bool confirmed;
DialogResponse({ DialogResponse({
//this.fieldOne, //this.fieldOne,
//this.fieldTwo, //this.fieldTwo,
this.responseText, this.responseText,
this.confirmed, required this.confirmed,
}); });
} }

View File

@ -1,5 +1,5 @@
class DictDao { class DictDao {
final int id; final int id;
final String name; final String name;
DictDao({ this.id, this.name}); DictDao({ required this.id, required this.name});
} }

View File

@ -1,7 +1,7 @@
class Message { class Message {
final String message; final String message;
Message({this.message}); Message({required this.message});
static Message fromJson(Map<String, dynamic> data) => Message(message : data['message']); static Message fromJson(Map<String, dynamic> data) => Message(message : data['message']);

View File

@ -1,5 +1,5 @@
class Money { class Money {
final num total; final num? total;
final bool loading; final bool loading;
Money({this.total, this.loading}); Money({this.total, required this.loading});
} }

View File

@ -6,11 +6,11 @@ class ProductDao {
final num price; final num price;
num count; num count;
num total; num total;
final Good good; final Good? good;
final Service service; final Service? service;
final String excise; final String? excise;
ProductDao( {this.name, this.price, this.count, this.total, this.good, this.service, this.excise }); ProductDao( {required this.name, required this.price, required this.count, required this.total, this.good, this.service, this.excise });
} }

View File

@ -1,9 +1,9 @@
class Response<T> { class Response<T> {
final T body; final T? body;
final int status; final int status;
final bool operation; final bool operation;
Response({this.body, this.operation, this.status}); Response({this.body, required this.operation, required this.status});
factory Response.fromJson(Map<String, dynamic> data, Function parser) { factory Response.fromJson(Map<String, dynamic> data, Function parser) {
return Response( return Response(

View File

@ -1,6 +1,6 @@
class SettingModel { class SettingModel {
const SettingModel({this.name, this.type, this.address}); const SettingModel({this.name, this.type, this.address});
final String type; final String? type;
final String name; final String? name;
final String address; final String? address;
} }

View File

@ -1,8 +1,8 @@
class Smena { class Smena {
final int id; final int? id;
final DateTime startedAt; final DateTime? startedAt;
final DateTime endedAt; final DateTime? endedAt;
final String message; final String? message;
Smena({this.id, this.startedAt, this.endedAt, this.message}); Smena({this.id, this.startedAt, this.endedAt, this.message});

View File

@ -1,15 +1,15 @@
class User { class User {
final String name; final String? name;
final String email; final String? email;
final String fullName; final String? fullName;
final String token; final String? token;
int appCompanyId; int? appCompanyId;
int kassaId; int? kassaId;
User({this.email, this.fullName, this.name, this.token, this.appCompanyId, this.kassaId}); User({this.email, this.fullName, this.name, this.token, this.appCompanyId, this.kassaId});
static User fromJson(Map<String, dynamic> json) { static User? fromJson(Map<String, dynamic> json) {
return json != null return json != null
? User ( ? User (
name: json['name'], name: json['name'],

View File

@ -19,66 +19,66 @@ Route<dynamic> generateRoute(RouteSettings settings) {
case LoginViewRoute: case LoginViewRoute:
LoginModel model = settings.arguments as LoginModel; LoginModel model = settings.arguments as LoginModel;
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: LoginView(loginModel: model,), viewToShow: LoginView(loginModel: model,),
); );
case HomeViewRoute: case HomeViewRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: HomeView(), viewToShow: HomeView(),
); );
case PaymentViewRoute: case PaymentViewRoute:
PaymentModel model = settings.arguments as PaymentModel; PaymentModel model = settings.arguments as PaymentModel;
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: PaymentView(model: model), viewToShow: PaymentView(model: model),
); );
case HistoryViewRoute: case HistoryViewRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: HistoryView(), viewToShow: HistoryView(),
); );
case InfoKkmViewRoute: case InfoKkmViewRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: InfoKkmView(), viewToShow: InfoKkmView(),
); );
case SettingsViewRoute: case SettingsViewRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: SettingView(), viewToShow: SettingView(),
); );
case QrViewRoute: case QrViewRoute:
ImageShowModel data = settings.arguments as ImageShowModel; ImageShowModel data = settings.arguments as ImageShowModel;
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: QrView(data), viewToShow: QrView(data),
); );
case ImageShowRoute: case ImageShowRoute:
ImageShowModel data = settings.arguments as ImageShowModel; ImageShowModel data = settings.arguments as ImageShowModel;
//return SlideRightRoute(widget: ImageShowContainer(data)); //return SlideRightRoute(widget: ImageShowContainer(data));
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: ImageShowContainer(data), viewToShow: ImageShowContainer(data),
); );
case SettingsPrinterRoute: case SettingsPrinterRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: SettingPrinterView(), viewToShow: SettingPrinterView(),
); );
case SettingsPrinterBTRoute: case SettingsPrinterBTRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: PrinterSelectView(), viewToShow: PrinterSelectView(),
); );
case SettingsPrinterEncodingRoute: case SettingsPrinterEncodingRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: PrinterEncodingView(), viewToShow: PrinterEncodingView(),
); );
case SettingsPrinterPaperRoute: case SettingsPrinterPaperRoute:
return _getPageRoute( return _getPageRoute(
routeName: settings.name, routeName: settings.name!,
viewToShow: PrinterPaperView(), viewToShow: PrinterPaperView(),
); );
default: default:
@ -90,7 +90,7 @@ Route<dynamic> generateRoute(RouteSettings settings) {
} }
} }
PageRoute _getPageRoute({String routeName, Widget viewToShow}) { PageRoute _getPageRoute({required String routeName, required Widget viewToShow}) {
return MaterialPageRoute( return MaterialPageRoute(
settings: RouteSettings( settings: RouteSettings(
name: routeName, name: routeName,
@ -100,7 +100,7 @@ PageRoute _getPageRoute({String routeName, Widget viewToShow}) {
class SlideRightRoute extends PageRouteBuilder { class SlideRightRoute extends PageRouteBuilder {
final Widget widget; final Widget widget;
SlideRightRoute({this.widget}) SlideRightRoute({required this.widget})
: super( : super(
pageBuilder: (BuildContext context, Animation<double> animation, pageBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) { Animation<double> secondaryAnimation) {

View File

@ -39,7 +39,7 @@ class ApiService extends BaseService {
}; };
String response = await requestFormData('/authenticate', requestBody, statusCheck: statusCheck ); String response = await requestFormData('/authenticate', requestBody, statusCheck: statusCheck );
AuthResponse aman = AuthResponse.fromJson(json.decode(response)); AuthResponse aman = AuthResponse.fromJson(json.decode(response));
return aman.body; return aman.body!;
} }
Future<AuthBody> authenticateToken(String token, { bool statusCheck = true}) async { Future<AuthBody> authenticateToken(String token, { bool statusCheck = true}) async {
@ -48,7 +48,7 @@ class ApiService extends BaseService {
}; };
String response = await requestFormData('/activate_token', requestBody, statusCheck: statusCheck ); String response = await requestFormData('/activate_token', requestBody, statusCheck: statusCheck );
AuthResponse aman = AuthResponse.fromJson(json.decode(response)); AuthResponse aman = AuthResponse.fromJson(json.decode(response));
return aman.body; return aman.body!;
} }
Future<Response<Message>> isActive(String token) async { Future<Response<Message>> isActive(String token) async {
@ -167,7 +167,7 @@ class ApiService extends BaseService {
new Future.delayed(const Duration(milliseconds: 1000), (){ new Future.delayed(const Duration(milliseconds: 1000), (){
_dialogService.showDialog(description: 'Необходимо пройти повторную авторизацию'); _dialogService.showDialog(description: 'Необходимо пройти повторную авторизацию');
UserState state = Redux.store.state.userState; UserState state = Redux.store!.state.userState!;
_navigatorService.replace(LoginViewRoute, arguments: LoginModel(authType: state.authenticateType, login: state.login, password: state.password )); _navigatorService.replace(LoginViewRoute, arguments: LoginModel(authType: state.authenticateType, login: state.login, password: state.password ));
}); });

View File

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:ffi';
import 'package:aman_kassa_flutter/core/base/base_service.dart'; import 'package:aman_kassa_flutter/core/base/base_service.dart';
import 'package:aman_kassa_flutter/core/entity/Category.dart'; import 'package:aman_kassa_flutter/core/entity/Category.dart';
@ -25,7 +26,8 @@ class DataService extends BaseService {
final ApiService _api = locator<ApiService>(); final ApiService _api = locator<ApiService>();
final DbService _db = locator<DbService>(); final DbService _db = locator<DbService>();
Future<List<Category>> getCategoriesByParentId({int parentId}) async { Future<List<Category>> getCategoriesByParentId(
{int? parentId}) async {
List<Map<String, dynamic>> list = await _db.queryRowsWithWhere( List<Map<String, dynamic>> list = await _db.queryRowsWithWhere(
Category_tableName, '$Category_columnParentIn = ?', [parentId ?? 0]); Category_tableName, '$Category_columnParentIn = ?', [parentId ?? 0]);
return list.map((e) => Category.fromMap(e)).toList(); return list.map((e) => Category.fromMap(e)).toList();
@ -36,35 +38,38 @@ class DataService extends BaseService {
return list.map((e) => Service.fromMap(e)).toList(); return list.map((e) => Service.fromMap(e)).toList();
} }
Future<List<Good>> getGoodsByCategoryId({int categoryId}) async { Future<List<Good>> getGoodsByCategoryId({int? categoryId}) async {
List<Map<String, dynamic>> list = await _db.queryRowsWithWhere( List<Map<String, dynamic>> list = await _db.queryRowsWithWhere(
Goog_tableName, '$Goog_columnCategoryId = ?', [categoryId ?? 0]); Goog_tableName, '$Goog_columnCategoryId = ?', [categoryId ?? 0]);
return list.map((e) => Good.fromMap(e)).toList(); return list.map((e) => Good.fromMap(e)).toList();
} }
Future<List<Good>> getGoodsByBarcode ({ String barcode}) async { Future<List<Good>> getGoodsByBarcode({required String barcode}) async {
List<Map<String, dynamic>> list = await _db.queryRowsWithWhere(Goog_tableName, ' $Goog_columnEan = ?', [barcode]); List<Map<String, dynamic>> list = await _db
.queryRowsWithWhere(Goog_tableName, ' $Goog_columnEan = ?', [barcode]);
return list.map((e) => Good.fromMap(e)).toList(); return list.map((e) => Good.fromMap(e)).toList();
} }
CheckData _transformProductsToCheckData( CheckData _transformProductsToCheckData(
{String paymentType, String tradeType, List<ProductDao> items}) { {String? paymentType,
String? tradeType,
required List<ProductDao> items}) {
List<CheckItem> itemsList = []; List<CheckItem> itemsList = [];
int iterator = 1; int iterator = 1;
num summ = 0.0; num summ = 0.0;
items.forEach((el) { items.forEach((el) {
int articul = iterator; int articul = iterator;
if (el.service != null) { if (el.service != null) {
articul = el.service.articul; articul = el.service!.articul;
} else if (el.good != null) { } else if (el.good != null) {
articul = el.good.articul; articul = el.good!.articul;
} }
itemsList.add(CheckItem( itemsList.add(CheckItem(
name: el.name ?? 'Позиция №$iterator', name: el.name,
cnt: el.count, cnt: el.count,
price: el.price, price: el.price,
articul: articul, articul: articul,
excise: el.excise, excise: el.excise,
)); ));
summ += el.total; summ += el.total;
iterator++; iterator++;
@ -77,7 +82,9 @@ class DataService extends BaseService {
} }
CheckData _transformCalcModelToCheckData( CheckData _transformCalcModelToCheckData(
{String paymentType, String tradeType, List<CalcModel> items}) { {String? paymentType,
String? tradeType,
required List<CalcModel> items}) {
List<CheckItem> itemsList = []; List<CheckItem> itemsList = [];
int iterator = 1; int iterator = 1;
num summ = 0.0; num summ = 0.0;
@ -85,7 +92,7 @@ class DataService extends BaseService {
int articul = iterator; int articul = iterator;
CheckItem item = CheckItem( CheckItem item = CheckItem(
name: 'Позиция $iterator', name: 'Позиция $iterator',
cnt: el.num2 != null ? double.parse(el.num2) : 1.0, cnt: el.num2 != null ? double.parse(el.num2!) : 1.0,
price: double.parse(el.num1), price: double.parse(el.num1),
articul: articul); articul: articul);
@ -111,13 +118,13 @@ class DataService extends BaseService {
* type * type
*/ */
Future<void> insertVoucher( Future<void> insertVoucher(
{@required User user, {required User user,
String data, String? data,
String base64Data, String? base64Data,
@required String name, required String name,
double total = 0.0, double total = 0.0,
String type = VoucherTypePayment, String type = VoucherTypePayment,
String url}) { String? url}) async {
assert(user != null); assert(user != null);
assert(name != null); assert(name != null);
Voucher voucher = Voucher() Voucher voucher = Voucher()
@ -133,21 +140,18 @@ class DataService extends BaseService {
log.i( log.i(
'save to db appCompanyId: ${user.appCompanyId}, kassaId: ${user.kassaId}'); 'save to db appCompanyId: ${user.appCompanyId}, kassaId: ${user.kassaId}');
_db.insert(Voucher_tableName, voucher.toMap()); _db.insert(Voucher_tableName, voucher.toMap());
return null;
} }
Future<Response<dynamic>?> sellOrReturn(
{String? paymentType,
Future<Response<dynamic>> sellOrReturn( String? tradeType,
{String paymentType, required String token,
String tradeType, required List<ProductDao> kassaItems,
String token, required List<CalcModel> calcItems,
List<ProductDao> kassaItems, required String operationType,
List<CalcModel> calcItems, required String mode}) async {
String operationType,
String mode}) async {
try { try {
String data; String data = "";
if (mode == SettingModeKassa) { if (mode == SettingModeKassa) {
CheckData checkData = _transformProductsToCheckData( CheckData checkData = _transformProductsToCheckData(
paymentType: paymentType, tradeType: tradeType, items: kassaItems); paymentType: paymentType, tradeType: tradeType, items: kassaItems);
@ -166,18 +170,20 @@ class DataService extends BaseService {
// log.i('response status: ${response.status}'); // log.i('response status: ${response.status}');
// log.i('response operation: ${response.operation}'); // log.i('response operation: ${response.operation}');
if (response.status == 200 && response.operation == true) { if (response.status == 200 && response.operation == true) {
User user = Redux.store.state.userState.user; User user = Redux.store!.state.userState!.user!;
//check compare //check compare
String check = response?.body['check']; String check = response.body['check'];
var checkText = response?.body['check_text']; var checkText = response.body['check_text'];
CheckImageModal imageModal = new CheckImageModal( base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ); CheckImageModal imageModal = new CheckImageModal(
base64Data: check,
textData: checkText != null ? jsonEncode(checkText) : null);
// journal analyze // journal analyze
dynamic journal = response?.body['journal']; dynamic journal = response.body['journal'];
int checkNum = journal['check_num']; int checkNum = journal['check_num'];
var summ = journal['summ']; var summ = journal['summ'];
// short url // short url
String url = response?.body['link']; String url = response.body['link'];
// total // total
double total = summ != null ? double.parse(summ.toString()) : 0.0; double total = summ != null ? double.parse(summ.toString()) : 0.0;
@ -201,9 +207,9 @@ class DataService extends BaseService {
} }
Future<void> checkDbFill(User user) async { Future<void> checkDbFill(User user) async {
int serviceCount = await _db.queryRowCount(Service_tableName); int serviceCount = await _db.queryRowCount(Service_tableName) ?? 0;
if (serviceCount == 0) { if (serviceCount == 0) {
int goodCount = await _db.queryRowCount(Goog_tableName); int goodCount = await _db.queryRowCount(Goog_tableName) ?? 0;
if (goodCount == 0) { if (goodCount == 0) {
await getDataFromServer(user); await getDataFromServer(user);
} else { } else {
@ -217,9 +223,10 @@ class DataService extends BaseService {
Future<bool> getDataFromServer(User user) async { Future<bool> getDataFromServer(User user) async {
log.i('Get Data from server'); log.i('Get Data from server');
try { try {
String token = user.token; String token = user.token!;
Response<dynamic> goods = await _api.getGoodsFromServer(token); Response<dynamic> goods = await _api.getGoodsFromServer(token);
if(goods.operation==false && [401,402,403,412].contains(goods.status)){ if (goods.operation == false &&
[401, 402, 403, 412].contains(goods.status)) {
log.i('session is closed'); log.i('session is closed');
return false; return false;
} }
@ -230,7 +237,6 @@ class DataService extends BaseService {
await _db.deleteAll(Service_tableName); await _db.deleteAll(Service_tableName);
log.i('All tables cleaned'); log.i('All tables cleaned');
if (goods.body.isNotEmpty) { if (goods.body.isNotEmpty) {
for (var key in goods.body.keys) { for (var key in goods.body.keys) {
Good row = Good.fromJson(goods.body[key]); Good row = Good.fromJson(goods.body[key]);

View File

@ -19,13 +19,13 @@ class DbService extends BaseService {
static final DbService instance = DbService._privateConstructor(); static final DbService instance = DbService._privateConstructor();
// only have a single app-wide reference to the database // only have a single app-wide reference to the database
static Database _database; static Database? _database;
Future<Database> get database async { Future<Database> get database async {
if (_database != null) return _database; if (_database != null) return _database!;
// lazily instantiate the db the first time it is accessed // lazily instantiate the db the first time it is accessed
_database = await _initDatabase(); _database = await _initDatabase();
return _database; return _database!;
} }
// this opens the database (and creates it if it doesn't exist) // this opens the database (and creates it if it doesn't exist)
@ -136,7 +136,7 @@ class DbService extends BaseService {
// All of the methods (insert, query, update, delete) can also be done using // All of the methods (insert, query, update, delete) can also be done using
// raw SQL commands. This method uses a raw query to give the row count. // raw SQL commands. This method uses a raw query to give the row count.
Future<int> queryRowCount(String table) async { Future<int?> queryRowCount(String table) async {
Database db = await instance.database; Database db = await instance.database;
return Sqflite.firstIntValue( return Sqflite.firstIntValue(
await db.rawQuery('SELECT COUNT(*) FROM $table')); await db.rawQuery('SELECT COUNT(*) FROM $table'));

View File

@ -10,18 +10,18 @@ import 'ApiService.dart';
class AuthenticationService extends BaseService { class AuthenticationService extends BaseService {
final ApiService _api; final ApiService _api;
AuthenticationService({ApiService api}) : _api = api; AuthenticationService({required ApiService api}) : _api = api;
User _currentUser; User? _currentUser;
User get currentUser => _currentUser; User? get currentUser => _currentUser;
Future<AuthBody> loginWithEmail({ Future<AuthBody?> loginWithEmail({
@required String email, required String email,
@required String password, required String password,
}) async { }) async {
try { try {
AuthBody result = await _api.authenticate(email, password); AuthBody? result = await _api.authenticate(email, password);
if (result.user != null) { if (result!=null && result.user != null) {
_currentUser = result.user; _currentUser = result.user;
} }
return result; return result;
@ -32,7 +32,7 @@ class AuthenticationService extends BaseService {
Future<bool> isUserLoggedIn(String token) async { Future<bool> isUserLoggedIn(String token) async {
Response<Message> session = await _api.isActive(token); Response<Message> session = await _api.isActive(token);
if ("OK" == session.body.message) { if ("OK" == session.body?.message) {
//_session = session; //_session = session;
return true; return true;
} }
@ -40,7 +40,7 @@ class AuthenticationService extends BaseService {
} }
Future<bool> logout(String token) async { Future<bool> logout(String token) async {
Response<Message> session = await _api.logout(token); Response<dynamic> session = await _api.logout(token);
if ("logout" == session.body.message) { if ("logout" == session.body.message) {
return true; return true;
} }

View File

@ -5,11 +5,11 @@ import 'package:flutter/cupertino.dart';
class DialogService { class DialogService {
GlobalKey<NavigatorState> _dialogNavigationKey = GlobalKey<NavigatorState>(); GlobalKey<NavigatorState> _dialogNavigationKey = GlobalKey<NavigatorState>();
Function(DialogRequest) _showDialogListener; Function(DialogRequest)? _showDialogListener;
Function(DialogRequest) _showDialogInputListener; Function(DialogRequest)? _showDialogInputListener;
Completer<DialogResponse> _dialogCompleter; Completer<DialogResponse>? _dialogCompleter;
Completer<DialogResponse> get completer => this._dialogCompleter; Completer<DialogResponse>? get completer => this._dialogCompleter;
GlobalKey<NavigatorState> get dialogNavigationKey => _dialogNavigationKey; GlobalKey<NavigatorState> get dialogNavigationKey => _dialogNavigationKey;
@ -23,53 +23,53 @@ class DialogService {
/// Calls the dialog listener and returns a Future that will wait for dialogComplete. /// Calls the dialog listener and returns a Future that will wait for dialogComplete.
Future<DialogResponse> showDialog({ Future<DialogResponse> showDialog({
String title = 'Aman Касса', String title = 'Aman Касса',
String description, required String description,
String buttonTitle = 'Ok', String buttonTitle = 'Ok',
}) { }) {
_dialogCompleter = Completer<DialogResponse>(); _dialogCompleter = Completer<DialogResponse>();
_showDialogListener(DialogRequest( _showDialogListener!(DialogRequest(
title: title, title: title,
description: description, description: description,
buttonTitle: buttonTitle, buttonTitle: buttonTitle,
)); ));
return _dialogCompleter.future; return _dialogCompleter!.future;
} }
/// Shows a confirmation dialog /// Shows a confirmation dialog
Future<DialogResponse> showConfirmationDialog( Future<DialogResponse> showConfirmationDialog(
{String title, {required String title,
String description, required String description,
String confirmationTitle = 'Ok', String confirmationTitle = 'Ok',
String cancelTitle = 'Cancel'}) { String cancelTitle = 'Cancel'}) {
_dialogCompleter = Completer<DialogResponse>(); _dialogCompleter = Completer<DialogResponse>();
_showDialogListener(DialogRequest( _showDialogListener!(DialogRequest(
title: title, title: title,
description: description, description: description,
buttonTitle: confirmationTitle, buttonTitle: confirmationTitle,
cancelTitle: cancelTitle)); cancelTitle: cancelTitle));
return _dialogCompleter.future; return _dialogCompleter!.future;
} }
Future<DialogResponse> showConfirmationDialogInput( Future<DialogResponse> showConfirmationDialogInput(
{String title = ' Aman Касса', {String title = ' Aman Касса',
String description, required String description,
String confirmationTitle = 'Ok', String confirmationTitle = 'Ok',
String cancelTitle = 'Cancel', String cancelTitle = 'Cancel',
String formatType}) { String? formatType}) {
_dialogCompleter = Completer<DialogResponse>(); _dialogCompleter = Completer<DialogResponse>();
_showDialogInputListener(DialogRequest( _showDialogInputListener!(DialogRequest(
title: title, title: title,
description: description, description: description,
buttonTitle: confirmationTitle, buttonTitle: confirmationTitle,
cancelTitle: cancelTitle, cancelTitle: cancelTitle,
formatType: formatType)); formatType: formatType));
return _dialogCompleter.future; return _dialogCompleter!.future;
} }
/// Completes the _dialogCompleter to resume the Future's execution call /// Completes the _dialogCompleter to resume the Future's execution call
void dialogComplete(DialogResponse response) { void dialogComplete(DialogResponse response) {
_dialogNavigationKey.currentState.pop(); _dialogNavigationKey.currentState!.pop();
_dialogCompleter.complete(response); _dialogCompleter!.complete(response);
_dialogCompleter = null; _dialogCompleter = null;
} }
} }

View File

@ -6,27 +6,27 @@ class NavigatorService extends BaseService {
Future<dynamic> push(String routeName, {dynamic arguments}) { Future<dynamic> push(String routeName, {dynamic arguments}) {
log.i('routeName: $routeName'); log.i('routeName: $routeName');
return navigatorKey.currentState return navigatorKey.currentState!
.pushNamed(routeName, arguments: arguments); .pushNamed(routeName, arguments: arguments);
} }
Future<dynamic> replace(String routeName, {dynamic arguments}) { Future<dynamic> replace(String routeName, {dynamic arguments}) {
log.i('routeName: $routeName'); log.i('routeName: $routeName');
return navigatorKey.currentState return navigatorKey.currentState!
.pushNamedAndRemoveUntil(routeName, (Route<dynamic> route) => false, arguments: arguments); .pushNamedAndRemoveUntil(routeName, (Route<dynamic> route) => false, arguments: arguments);
} }
Future<T> navigateToPage<T>(MaterialPageRoute<T> pageRoute) async { Future<T?> navigateToPage<T>(MaterialPageRoute<T> pageRoute) async {
log.i('navigateToPage: pageRoute: ${pageRoute.settings.name}'); log.i('navigateToPage: pageRoute: ${pageRoute.settings.name}');
if (navigatorKey.currentState == null) { if (navigatorKey.currentState == null) {
log.e('navigateToPage: Navigator State is null'); log.e('navigateToPage: Navigator State is null');
return null; return null;
} }
return navigatorKey.currentState.push(pageRoute); return navigatorKey.currentState!.push(pageRoute);
} }
Future<T> navigateToPageWithReplacement<T>( Future<T?> navigateToPageWithReplacement<T>(
MaterialPageRoute<T> pageRoute) async { MaterialPageRoute<T> pageRoute) async {
log.i('navigateToPageWithReplacement: ' log.i('navigateToPageWithReplacement: '
'pageRoute: ${pageRoute.settings.name}'); 'pageRoute: ${pageRoute.settings.name}');
@ -34,15 +34,15 @@ class NavigatorService extends BaseService {
log.e('navigateToPageWithReplacement: Navigator State is null'); log.e('navigateToPageWithReplacement: Navigator State is null');
return null; return null;
} }
return navigatorKey.currentState.pushReplacement(pageRoute); return navigatorKey.currentState!.pushReplacement(pageRoute);
} }
void pop<T>([T result]) { void pop<T>([T? result]) {
log.i('goBack:'); log.i('goBack:');
if (navigatorKey.currentState == null) { if (navigatorKey.currentState == null) {
log.e('goBack: Navigator State is null'); log.e('goBack: Navigator State is null');
return; return;
} }
navigatorKey.currentState.pop(result); navigatorKey.currentState!.pop(result);
} }
} }

View File

@ -1,4 +1,4 @@
List<String> parseListString(json){ List<String>? parseListString(json){
if(json==null) return null; if(json==null) return null;
return new List<String>.from(json); return new List<String>.from(json);
} }

View File

@ -7,7 +7,9 @@ import 'dart:io';
import 'package:aman_kassa_flutter/shared/app_colors.dart'; import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
//service & tools //service & tools
import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:aman_kassa_flutter/redux/store.dart';
import 'core/locator.dart'; import 'core/locator.dart';
@ -15,10 +17,10 @@ import 'core/router.dart';
import 'core/services/navigator_service.dart'; import 'core/services/navigator_service.dart';
import 'core/services/dialog_service.dart'; import 'core/services/dialog_service.dart';
import './widgets/dialog_manager.dart'; import './widgets/dialog_manager.dart';
//pages //pages
import 'views/start_up/start_up_view.dart'; import 'views/start_up/start_up_view.dart';
//main start //main start
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@ -35,41 +37,46 @@ void main() async {
runApp(MainApplication()); runApp(MainApplication());
} }
class MyHttpOverrides extends HttpOverrides{ class MyHttpOverrides extends HttpOverrides {
@override @override
HttpClient createHttpClient(SecurityContext context){ HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context) return super.createHttpClient(context)
..badCertificateCallback = (X509Certificate cert, String host, int port)=> true; ..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
} }
} }
class MainApplication extends StatelessWidget { class MainApplication extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StoreProvider<AppState>( return StoreProvider<AppState>(
store: Redux.store, store: Redux.store!,
child: MaterialApp( child: ScreenUtilInit(
theme: ThemeData( designSize: const Size(
backgroundColor: backgroundColor, 411.43,
primaryColor: primaryColor, 683.43,
accentColor: yellowColor, ),
scaffoldBackgroundColor: Colors.white, builder: () => MaterialApp(
theme: ThemeData(
backgroundColor: backgroundColor,
primaryColor: primaryColor,
accentColor: yellowColor,
scaffoldBackgroundColor: Colors.white,
// textTheme: GoogleFonts.latoTextTheme( // textTheme: GoogleFonts.latoTextTheme(
// Theme.of(context).textTheme, // Theme.of(context).textTheme,
// ) // )
),
debugShowCheckedModeBanner: false,
builder: (context, child) => Navigator(
key: locator<DialogService>().dialogNavigationKey,
onGenerateRoute: (settings) => MaterialPageRoute(
builder: (context) => DialogManager(child: child)),
),
navigatorKey: locator<NavigatorService>().navigatorKey,
home: StartUpView(),
// first page
onGenerateRoute: generateRoute,
), ),
debugShowCheckedModeBanner: false, ));
builder: (context, child) => Navigator(
key: locator<DialogService>().dialogNavigationKey,
onGenerateRoute: (settings) => MaterialPageRoute(
builder: (context) => DialogManager(child: child)),
),
navigatorKey: locator<NavigatorService>().navigatorKey,
home: StartUpView(), // first page
onGenerateRoute: generateRoute,
),
);
} }
} }

View File

@ -1,3 +1,4 @@
import 'package:aman_kassa_flutter/core/models/calc_model.dart';
import 'package:aman_kassa_flutter/redux/state/calc_state.dart'; import 'package:aman_kassa_flutter/redux/state/calc_state.dart';
import 'package:aman_kassa_flutter/widgets/components/calculator/calculator.dart'; import 'package:aman_kassa_flutter/widgets/components/calculator/calculator.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
@ -26,7 +27,7 @@ ThunkAction<AppState> onTapAction(String value) {
if(value == Calculations.EQUAL){ if(value == Calculations.EQUAL){
return setEqual(store); return setEqual(store);
} }
List calcItems = Calculator.action(value: value, items: store.state.calcState.calcItems); List<CalcModel> calcItems = Calculator.action(value: value, items: store.state.calcState!.calcItems!);
store.dispatch(SetCalcStateAction(CalcState(calcItems: calcItems, isEqual: false))); store.dispatch(SetCalcStateAction(CalcState(calcItems: calcItems, isEqual: false)));
}; };
} }

View File

@ -24,8 +24,8 @@ final DataService _dataService = locator<DataService>();
final DialogService _dialogService = locator<DialogService>(); final DialogService _dialogService = locator<DialogService>();
Future<void> backBottomElement(Store<AppState> store) async { Future<void> backBottomElement(Store<AppState> store) async {
List<DictDao> prevCategories = store.state.kassaState.prevCategories; List<DictDao>? prevCategories = store.state.kassaState!.prevCategories;
DictDao last = prevCategories.removeLast(); DictDao? last = prevCategories?.removeLast() ;
if (last != null) { if (last != null) {
store.dispatch(SetKassaStateAction(KassaState(prevCategories: prevCategories))); store.dispatch(SetKassaStateAction(KassaState(prevCategories: prevCategories)));
store.dispatch(selectBottomElement(last.id)); store.dispatch(selectBottomElement(last.id));
@ -38,16 +38,16 @@ Future<void> cleanKassaItems(Store<AppState> store) async {
ThunkAction<AppState> addCustomProductToKassaItems(String name, int count, double price, double total) { ThunkAction<AppState> addCustomProductToKassaItems(String name, int count, double price, double total) {
return (Store<AppState> store) async { return (Store<AppState> store) async {
List<ProductDao> items = store.state.kassaState.kassaItems; List<ProductDao> items = store.state.kassaState!.kassaItems!;
items.add(new ProductDao(name: name, count: count, price: price, total: total)); items.add(new ProductDao(name: name, count: count, price: price, total: total));
store.dispatch(SetKassaStateAction(KassaState(kassaItems: items))); store.dispatch(SetKassaStateAction(KassaState(kassaItems: items)));
}; };
} }
ThunkAction<AppState> addProductToKassaItems(Good good, String excise) { ThunkAction<AppState> addProductToKassaItems(Good good, String? excise) {
return (Store<AppState> store) async { return (Store<AppState> store) async {
List<ProductDao> items = store.state.kassaState.kassaItems; List<ProductDao> items = store.state.kassaState!.kassaItems!;
int index = items.indexWhere((element) => element.excise == null && element.good?.id == good.id); int index = items.indexWhere((element) => element.excise == null && element.good?.id == good.id);
if(excise !=null) { if(excise !=null) {
int existIndex = items.indexWhere((element) => element.excise != null && element.excise == excise); int existIndex = items.indexWhere((element) => element.excise != null && element.excise == excise);
@ -68,7 +68,7 @@ ThunkAction<AppState> addProductToKassaItems(Good good, String excise) {
ThunkAction<AppState> addServiceToKassaItems(Service service) { ThunkAction<AppState> addServiceToKassaItems(Service service) {
return (Store<AppState> store) async { return (Store<AppState> store) async {
List<ProductDao> items = store.state.kassaState.kassaItems; List<ProductDao> items = store.state.kassaState!.kassaItems!;
int index = items.indexWhere((element) => element.good?.id == service.id); int index = items.indexWhere((element) => element.good?.id == service.id);
if (index > -1) { if (index > -1) {
store.dispatch(counterProductFromKassaItems(index, 1)); store.dispatch(counterProductFromKassaItems(index, 1));
@ -82,7 +82,7 @@ ThunkAction<AppState> addServiceToKassaItems(Service service) {
ThunkAction<AppState> removeProductFromKassaItems(int index) { ThunkAction<AppState> removeProductFromKassaItems(int index) {
return (Store<AppState> store) async { return (Store<AppState> store) async {
List<ProductDao> items = List.from(store.state.kassaState.kassaItems); List<ProductDao> items = List.from(store.state.kassaState!.kassaItems!);
items.removeAt(index); items.removeAt(index);
store.dispatch(SetKassaStateAction(KassaState(kassaItems: items))); store.dispatch(SetKassaStateAction(KassaState(kassaItems: items)));
}; };
@ -90,7 +90,7 @@ ThunkAction<AppState> removeProductFromKassaItems(int index) {
ThunkAction<AppState> counterProductFromKassaItems(int index, int counter) { ThunkAction<AppState> counterProductFromKassaItems(int index, int counter) {
return (Store<AppState> store) async { return (Store<AppState> store) async {
List<ProductDao> items = store.state.kassaState.kassaItems; List<ProductDao> items = store.state.kassaState!.kassaItems!;
ProductDao product = items.elementAt(index); ProductDao product = items.elementAt(index);
if (product.count == 1 && counter < 0) { if (product.count == 1 && counter < 0) {
//if count to zero need delete element //if count to zero need delete element
@ -107,24 +107,24 @@ ThunkAction<AppState> selectBottomElement(int parentId) {
return (Store<AppState> store) async { return (Store<AppState> store) async {
store.dispatch(SetKassaStateAction(KassaState(bottomSheetLoading: true, bottomSheetElements: []))); store.dispatch(SetKassaStateAction(KassaState(bottomSheetLoading: true, bottomSheetElements: [])));
try { try {
List<DictDao> prevCategories = store.state.kassaState.prevCategories; List<DictDao> prevCategories = store.state.kassaState!.prevCategories!;
if (parentId == 0) { if (parentId == 0) {
prevCategories = []; prevCategories = [];
} }
store.state.kassaState.bottomSheetElements.forEach((element) { store.state.kassaState!.bottomSheetElements!.forEach((element) {
if (element is Category && element.id == parentId) { if (element is Category && element.id == parentId) {
prevCategories.add(DictDao(id: element.parentIn, name: element.name)); prevCategories.add(DictDao(id: element.parentIn!, name: element.name));
} }
}); });
List _bottomSheetElements = []; List _bottomSheetElements = [];
if(store.state.settingState.tradeType == SettingTradeTypeGood) { if(store.state.settingState!.tradeType == SettingTradeTypeGood) {
List<Category> categories = await _dataService.getCategoriesByParentId(parentId: parentId); List<Category> categories = await _dataService.getCategoriesByParentId(parentId: parentId);
_bottomSheetElements.addAll(categories); _bottomSheetElements.addAll(categories);
List<Good> goods = await _dataService.getGoodsByCategoryId(categoryId: parentId); List<Good> goods = await _dataService.getGoodsByCategoryId(categoryId: parentId);
_bottomSheetElements.addAll(goods); _bottomSheetElements.addAll(goods);
} else if(store.state.settingState.tradeType == SettingTradeTypeService) { } else if(store.state.settingState!.tradeType == SettingTradeTypeService) {
List<Service> services = await _dataService.getServices(); List<Service> services = await _dataService.getServices();
_bottomSheetElements.addAll(services); _bottomSheetElements.addAll(services);
} }

View File

@ -30,17 +30,17 @@ final DialogService _dialogService = locator<DialogService>();
Future<void> checkUserAction(Store<AppState> store) async { Future<void> checkUserAction(Store<AppState> store) async {
store.dispatch(SetUserStateAction(UserState(isLoading: true))); store.dispatch(SetUserStateAction(UserState(isLoading: true)));
try { try {
User user = store.state.userState.user; User? user = store.state.userState?.user;
String token = user?.token; String? token = user?.token;
bool isAuthenticated = false; bool isAuthenticated = false;
if (token != null) { if (token != null && user !=null) {
if(user.email!=null && user.email.toLowerCase().trim().startsWith('test')){ if(user.email!=null && user.email!.toLowerCase().trim().startsWith('test')){
_api.test = true; _api.test = true;
} else { } else {
_api.test = false; _api.test = false;
} }
Response<Message> session = await _api.isActive(token); Response<Message> session = await _api.isActive(token);
isAuthenticated = "OK" == session.body.message; isAuthenticated = "OK" == session.body?.message;
} else { } else {
await Future.delayed(Duration(milliseconds: 2000)); await Future.delayed(Duration(milliseconds: 2000));
@ -82,11 +82,11 @@ Future<void> logoutAction(Store<AppState> store) async {
} }
} }
Future<Response<dynamic>> checkMoney(Store<AppState> store) async { Future<Response<dynamic>?> checkMoney(Store<AppState> store) async {
store.dispatch(SetUserStateAction(UserState(money: Money(loading: true)))); store.dispatch(SetUserStateAction(UserState(money: Money(loading: true))));
try { try {
Response<dynamic> result = Response<dynamic> result =
await _api.money(store.state.userState.user.token); await _api.money(store.state.userState!.user!.token!);
if (result.operation) { if (result.operation) {
store.dispatch(SetUserStateAction(UserState( store.dispatch(SetUserStateAction(UserState(
money: Money( money: Money(
@ -165,20 +165,20 @@ ThunkAction<AppState> authenticate(String email, String password) {
} }
Future<void> checkSmena(Store<AppState> store) async { Future<void> checkSmena(Store<AppState> store) async {
String token = store.state.userState.user.token; String token = store.state.userState!.user!.token!;
Response<Smena> result = await _api.smena(token); Response<Smena> result = await _api.smena(token);
store.dispatch(SetUserStateAction(UserState(smena: result.body))); store.dispatch(SetUserStateAction(UserState(smena: result.body)));
} }
Future<void> closeSmena(Store<AppState> store) async { Future<void> closeSmena(Store<AppState> store) async {
String token = store.state.userState.user.token; String token = store.state.userState!.user!.token!;
Response<Smena> result = await _api.closeSmena(token); Response<Smena> result = await _api.closeSmena(token);
store.dispatch(SetUserStateAction(UserState(smena: result.body))); store.dispatch(SetUserStateAction(UserState(smena: result.body)));
store.dispatch(checkMoney); store.dispatch(checkMoney);
} }
Future<void> openSmena(Store<AppState> store) async { Future<void> openSmena(Store<AppState> store) async {
String token = store.state.userState.user.token; String token = store.state.userState!.user!.token!;
Response<Smena> result = await _api.openSmena(token); Response<Smena> result = await _api.openSmena(token);
store.dispatch(SetUserStateAction(UserState(smena: result.body))); store.dispatch(SetUserStateAction(UserState(smena: result.body)));
if (result.operation) { if (result.operation) {

View File

@ -3,8 +3,8 @@ import 'package:meta/meta.dart';
@immutable @immutable
class CalcState { class CalcState {
final List<CalcModel> calcItems; final List<CalcModel>? calcItems;
final bool isEqual; final bool? isEqual;
CalcState({this.calcItems, this.isEqual}); CalcState({this.calcItems, this.isEqual});

View File

@ -4,10 +4,10 @@ import 'package:meta/meta.dart';
@immutable @immutable
class KassaState { class KassaState {
final List bottomSheetElements; final List? bottomSheetElements;
final bool bottomSheetLoading; final bool? bottomSheetLoading;
final List<DictDao> prevCategories; final List<DictDao>? prevCategories;
final List<ProductDao> kassaItems; final List<ProductDao>? kassaItems;
KassaState( KassaState(

View File

@ -4,14 +4,14 @@ import 'package:flutter_bluetooth_basic/src/bluetooth_device.dart';
@immutable @immutable
class SettingState { class SettingState {
final String mode; final String? mode;
final String tradeType; final String? tradeType;
final String pinCode; final String? pinCode;
final bool pinLocked; final bool? pinLocked;
final bool pinSkip; final bool? pinSkip;
final BluetoothDevice printerBT; final BluetoothDevice? printerBT;
final String printerEncoding; final String? printerEncoding;
final String printerPaperSize; final String? printerPaperSize;
SettingState({this.mode, this.tradeType, this.pinCode, this.pinLocked, this.pinSkip, this.printerBT, SettingState({this.mode, this.tradeType, this.pinCode, this.pinLocked, this.pinSkip, this.printerBT,
@ -19,7 +19,7 @@ class SettingState {
this.printerPaperSize}); this.printerPaperSize});
//read hive //read hive
factory SettingState.initial(SettingState payload) { factory SettingState.initial(SettingState? payload) {
return SettingState( return SettingState(
mode: payload?.mode ?? SettingModeKassa, mode: payload?.mode ?? SettingModeKassa,
tradeType: payload?.tradeType ?? SettingTradeTypeGood, tradeType: payload?.tradeType ?? SettingTradeTypeGood,
@ -56,7 +56,7 @@ class SettingState {
); );
} }
static SettingState fromJson(dynamic json) { static SettingState? fromJson(dynamic json) {
return json != null return json != null
? SettingState( ? SettingState(
tradeType: json['tradeType'], tradeType: json['tradeType'],
@ -80,7 +80,7 @@ class SettingState {
"pinCode": pinCode, "pinCode": pinCode,
"pinLocked" : pinLocked, "pinLocked" : pinLocked,
"pinSkip" : pinSkip, "pinSkip" : pinSkip,
"printerBT": printerBT != null ? printerBT.toJson() : null, "printerBT": printerBT != null ? printerBT!.toJson() : null,
"printerEncoding": printerEncoding, "printerEncoding": printerEncoding,
"printerPaperSize": printerPaperSize, "printerPaperSize": printerPaperSize,
}; };

View File

@ -5,16 +5,16 @@ import 'package:meta/meta.dart';
@immutable @immutable
class UserState { class UserState {
final bool isError; final bool? isError;
final bool isLoading; final bool? isLoading;
final bool isAuthenticated; final bool? isAuthenticated;
final String authenticateType; final String? authenticateType;
final String login; final String? login;
final String password; final String? password;
final LoginFormMessage loginFormMessage; final LoginFormMessage? loginFormMessage;
final User user; final User? user;
final Smena smena; final Smena? smena;
final Money money; final Money? money;
UserState( UserState(
@ -30,7 +30,7 @@ class UserState {
this.money, this.money,
}); });
factory UserState.initial(UserState payload) => UserState( factory UserState.initial(UserState? payload) => UserState(
isLoading: false, isLoading: false,
isError: false, isError: false,
isAuthenticated: false, isAuthenticated: false,
@ -44,16 +44,16 @@ class UserState {
); );
UserState copyWith({ UserState copyWith({
@required bool isError, @required bool? isError,
@required bool isLoading, @required bool? isLoading,
@required User user, @required User? user,
@required bool isAuthenticated, @required bool? isAuthenticated,
@required LoginFormMessage loginFormMessage, @required LoginFormMessage? loginFormMessage,
@required Smena smena, @required Smena? smena,
@required String authenticateType, @required String? authenticateType,
@required String login, @required String? login,
@required String password, @required String? password,
@required Money money, @required Money? money,
}) { }) {
return UserState( return UserState(
isError: isError ?? this.isError, isError: isError ?? this.isError,
@ -69,7 +69,7 @@ class UserState {
); );
} }
static UserState fromJson(dynamic json) { static UserState? fromJson(dynamic json) {
return json != null return json != null
? UserState( ? UserState(
user: User.fromJson(json['user']), user: User.fromJson(json['user']),
@ -82,7 +82,7 @@ class UserState {
dynamic toJson() { dynamic toJson() {
return { return {
"user": user != null ? user.toJson() : null, "user": user != null ? user!.toJson() : null,
"authenticateType": authenticateType, "authenticateType": authenticateType,
"login": login, "login": login,
"password": password, "password": password,
@ -91,9 +91,9 @@ class UserState {
} }
class LoginFormMessage { class LoginFormMessage {
final String email; final String? email;
final String password; final String? password;
final String message; final String? message;
LoginFormMessage({this.email, this.password, this.message}); LoginFormMessage({this.email, this.password, this.message});
} }

View File

@ -21,19 +21,19 @@ import 'actions/calc_actions.dart';
AppState appReducer(AppState state, dynamic action) { AppState appReducer(AppState state, dynamic action) {
if (action is SetUserStateAction) { if (action is SetUserStateAction) {
/** UserAction **/ /** UserAction **/
final nextUserState = userReducer(state.userState, action); final nextUserState = userReducer(state.userState!, action);
return state.copyWith(userState: nextUserState); return state.copyWith(userState: nextUserState);
} else if (action is SetKassaStateAction) { } else if (action is SetKassaStateAction) {
/** KassaAction **/ /** KassaAction **/
final nextMainState = mainReducer(state.kassaState, action); final nextMainState = mainReducer(state.kassaState!, action);
return state.copyWith(kassaState: nextMainState); return state.copyWith(kassaState: nextMainState);
} else if (action is SetSettingStateAction) { } else if (action is SetSettingStateAction) {
/** SettingAction **/ /** SettingAction **/
final nextSettingState = settingReducer(state.settingState, action); final nextSettingState = settingReducer(state.settingState!, action);
return state.copyWith(settingState: nextSettingState); return state.copyWith(settingState: nextSettingState);
} else if (action is SetCalcStateAction) { } else if (action is SetCalcStateAction) {
/** CalcAction **/ /** CalcAction **/
final nextCalcState = calcReducer(state.calcState, action); final nextCalcState = calcReducer(state.calcState!, action);
return state.copyWith(calcState: nextCalcState); return state.copyWith(calcState: nextCalcState);
} }
return state; return state;
@ -42,10 +42,10 @@ AppState appReducer(AppState state, dynamic action) {
//Main State //Main State
@immutable @immutable
class AppState { class AppState {
final UserState userState; final UserState? userState;
final KassaState kassaState; final KassaState? kassaState;
final SettingState settingState; final SettingState? settingState;
final CalcState calcState; final CalcState? calcState;
AppState({ AppState({
this.userState, this.userState,
@ -56,10 +56,10 @@ class AppState {
//stable work //stable work
AppState copyWith({ AppState copyWith({
UserState userState, UserState? userState,
KassaState kassaState, KassaState? kassaState,
SettingState settingState, SettingState? settingState,
CalcState calcState, CalcState? calcState,
}) { }) {
return AppState( return AppState(
userState: userState ?? this.userState, userState: userState ?? this.userState,
@ -69,7 +69,7 @@ class AppState {
); );
} }
static AppState fromJson(dynamic json){ static AppState? fromJson(dynamic json){
return json !=null return json !=null
? AppState( ? AppState(
settingState: SettingState.fromJson(json['settingState']), settingState: SettingState.fromJson(json['settingState']),
@ -80,16 +80,16 @@ class AppState {
dynamic toJson() { dynamic toJson() {
return { return {
"settingState": settingState.toJson(), "settingState": settingState?.toJson(),
"userState" : userState.toJson(), "userState" : userState?.toJson(),
}; };
} }
} }
class Redux { class Redux {
static Store<AppState> _store; static Store<AppState>? _store;
static Store<AppState> get store { static Store<AppState>? get store {
if (_store == null) { if (_store == null) {
throw Exception("store is not initialized"); throw Exception("store is not initialized");
} else { } else {

View File

@ -19,7 +19,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bluetooth_basic/flutter_bluetooth_basic.dart'; import 'package:flutter_bluetooth_basic/flutter_bluetooth_basic.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:esys_flutter_share/esys_flutter_share.dart'; import 'package:vocsy_esys_flutter_share/vocsy_esys_flutter_share.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class ImageShowContainer extends StatefulWidget { class ImageShowContainer extends StatefulWidget {
@ -34,14 +34,15 @@ class ImageShowContainer extends StatefulWidget {
class _ImageShowContainerState extends State<ImageShowContainer> { class _ImageShowContainerState extends State<ImageShowContainer> {
final PrinterBluetoothManager printerManager = PrinterBluetoothManager(); final PrinterBluetoothManager printerManager = PrinterBluetoothManager();
final DialogService _dialogService = locator<DialogService>(); final DialogService _dialogService = locator<DialogService>();
final BluetoothDevice printerBtDevice = Redux.store.state.settingState.printerBT; final BluetoothDevice? printerBtDevice =
Redux.store!.state.settingState!.printerBT;
final BluetoothManager bluetoothManager = BluetoothManager.instance; final BluetoothManager bluetoothManager = BluetoothManager.instance;
bool _printing = false; bool _printing = false;
void _preparePrint() async { void _preparePrint() async {
if (Platform.isIOS) { if (Platform.isIOS) {
await _print(); _print();
} else { } else {
bluetoothManager.state.listen((val) { bluetoothManager.state.listen((val) {
print("state = $val"); print("state = $val");
@ -49,11 +50,11 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
if (val == 12) { if (val == 12) {
print('on'); print('on');
_print(); _print();
} else if (val == 10) { } else if (val == 10) {
print('off'); print('off');
_dialogService.showDialog( _dialogService.showDialog(
description: 'Отсутвует соеденение Bluetooth или он отключен' , title: 'Bluetooth'); description: 'Отсутвует соеденение Bluetooth или он отключен',
title: 'Bluetooth');
} }
print('state is $val'); print('state is $val');
}); });
@ -61,9 +62,10 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
} }
void _print() async { void _print() async {
final SettingState state = Redux.store.state.settingState; final SettingState state = Redux.store!.state.settingState!;
if(state.printerBT == null) { if (state.printerBT == null) {
_dialogService.showDialog(description: 'Укажите в настройках принтер для печати чеков'); _dialogService.showDialog(
description: 'Укажите в настройках принтер для печати чеков');
return; return;
} }
@ -71,7 +73,7 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
int chunkSizeBytes = 3096; int chunkSizeBytes = 3096;
int queueSleepTimeMs = 100; int queueSleepTimeMs = 100;
if(isIos){ if (isIos) {
chunkSizeBytes = 75; chunkSizeBytes = 75;
queueSleepTimeMs = 10; queueSleepTimeMs = 10;
} }
@ -80,13 +82,13 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
_printing = true; _printing = true;
}); });
try { try {
printerManager.selectPrinter(PrinterBluetooth(state.printerBT)); printerManager.selectPrinter(PrinterBluetooth(state.printerBT!));
PaperSize paper = state.printerPaperSize == SettingPrinterPaperM80 PaperSize paper = state.printerPaperSize == SettingPrinterPaperM80
? PaperSize.mm80 ? PaperSize.mm80
: PaperSize.mm58; : PaperSize.mm58;
if (SettingPrinterEncodingImage == state.printerEncoding) { if (SettingPrinterEncodingImage == state.printerEncoding) {
final PosPrintResult res = await printerManager.printTicket( final PosPrintResult res = await printerManager.printTicket(
await printImageCheck(paper, widget.showModel.data.base64Data), await printImageCheck(paper, widget.showModel.data!.base64Data!),
chunkSizeBytes: chunkSizeBytes, chunkSizeBytes: chunkSizeBytes,
queueSleepTimeMs: queueSleepTimeMs); queueSleepTimeMs: queueSleepTimeMs);
if (res.value != 1) { if (res.value != 1) {
@ -94,9 +96,8 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
} }
} else { } else {
final PosPrintResult res = await printerManager.printTicket( final PosPrintResult res = await printerManager.printTicket(
await printTextCheck( await printTextCheck(paper, state.printerEncoding!,
paper, state.printerEncoding, jsonDecode(widget.showModel.data!.textData!)),
jsonDecode(widget.showModel.data.textData)),
chunkSizeBytes: chunkSizeBytes, chunkSizeBytes: chunkSizeBytes,
queueSleepTimeMs: queueSleepTimeMs); queueSleepTimeMs: queueSleepTimeMs);
if (res.value != 1) { if (res.value != 1) {
@ -119,7 +120,7 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
//backgroundColor: fillColor, //backgroundColor: fillColor,
title: Text(widget.showModel.title), title: Text(widget.showModel.title),
actions: [ actions: [
if(_printing) if (_printing)
Padding( Padding(
padding: const EdgeInsets.only(right: 8.0), padding: const EdgeInsets.only(right: 8.0),
child: SizedBox( child: SizedBox(
@ -127,8 +128,7 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
child: Center( child: Center(
child: CircularProgressIndicator( child: CircularProgressIndicator(
strokeWidth: 2, strokeWidth: 2,
valueColor: new AlwaysStoppedAnimation<Color>( valueColor: new AlwaysStoppedAnimation<Color>(whiteColor),
whiteColor),
), ),
), ),
), ),
@ -138,7 +138,9 @@ class _ImageShowContainerState extends State<ImageShowContainer> {
], ],
), ),
body: ListView( body: ListView(
children: <Widget>[imageFromBase64String(widget.showModel.data.base64Data)], children: <Widget>[
imageFromBase64String(widget.showModel.data!.base64Data!)
],
), ),
floatingActionButton: MyFloatingActionButton(widget.showModel), floatingActionButton: MyFloatingActionButton(widget.showModel),
); );
@ -153,16 +155,18 @@ Padding imageFromBase64String(String base64String) {
} }
class ImageShowModel { class ImageShowModel {
final CheckImageModal data; final CheckImageModal? data;
final String title; final String title;
final String url; final String? url;
ImageShowModel({this.data, this.title, this.url}); ImageShowModel({this.data, required this.title, this.url});
} }
class MyFloatingActionButton extends StatefulWidget { class MyFloatingActionButton extends StatefulWidget {
final ImageShowModel data; final ImageShowModel data;
MyFloatingActionButton(this.data); MyFloatingActionButton(this.data);
@override @override
_MyFloatingActionButtonState createState() => _MyFloatingActionButtonState(); _MyFloatingActionButtonState createState() => _MyFloatingActionButtonState();
} }
@ -172,13 +176,10 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
DialogService _dialog = locator<DialogService>(); DialogService _dialog = locator<DialogService>();
NavigatorService _navigatorService = locator<NavigatorService>(); NavigatorService _navigatorService = locator<NavigatorService>();
double sheetHeight = 260; double sheetHeight = 260;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return showFab return showFab
? FloatingActionButton( ? FloatingActionButton(
child: Icon(Icons.share), child: Icon(Icons.share),
@ -193,7 +194,7 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
blurRadius: 10, blurRadius: 10,
color: Colors.grey[300], color: Colors.grey[300]!,
spreadRadius: 5) spreadRadius: 5)
]), ]),
height: sheetHeight, height: sheetHeight,
@ -236,7 +237,7 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
void shareFile() async { void shareFile() async {
try { try {
await Share.file('Aman Kassa', 'aman_kassa_check.png', await Share.file('Aman Kassa', 'aman_kassa_check.png',
base64Decode(widget.data.data.base64Data), 'image/png'); base64Decode(widget.data.data!.base64Data!), 'image/png');
} catch (e) { } catch (e) {
print('error: $e'); print('error: $e');
} }
@ -255,15 +256,15 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
confirmationTitle: 'Отправить', confirmationTitle: 'Отправить',
formatType: 'phone'); formatType: 'phone');
if (response.confirmed) { if (response.confirmed) {
String phoneNumber = response.responseText; String phoneNumber = response.responseText!;
String msg = "Спасибо за покупку! \r\n ${widget.data.url} "; String msg = "Спасибо за покупку! \r\n ${widget.data.url} ";
launchWhatsApp(phone: phoneNumber, message: msg); launchWhatsApp(phone: phoneNumber, message: msg);
} }
} }
void launchWhatsApp({ void launchWhatsApp({
@required String phone, required String phone,
@required String message, required String message,
}) async { }) async {
String url() { String url() {
if (Platform.isIOS) { if (Platform.isIOS) {

View File

@ -65,7 +65,7 @@ class _HistoryViewState extends State<HistoryView> {
}, },
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
Voucher voucher = data[index]; Voucher voucher = data[index];
String base64Data = voucher.base64Data; String? base64Data = voucher.base64Data;
CheckImageModal checkImageData; CheckImageModal checkImageData;
if(base64Data !=null && base64Data.startsWith('{')){ if(base64Data !=null && base64Data.startsWith('{')){
checkImageData = CheckImageModal.fromJson(jsonDecode(base64Data)); checkImageData = CheckImageModal.fromJson(jsonDecode(base64Data));
@ -77,11 +77,11 @@ class _HistoryViewState extends State<HistoryView> {
_navigatorService.push(ImageShowRoute, _navigatorService.push(ImageShowRoute,
arguments: ImageShowModel( arguments: ImageShowModel(
data: checkImageData, data: checkImageData,
title: voucher.name, title: voucher.name!,
url: voucher.url)); url: voucher.url!));
}, },
title: buildText(voucher), title: buildText(voucher),
subtitle: Text(dateFormat.format(voucher.dateTime)), subtitle: Text(dateFormat.format(voucher.dateTime!)),
trailing: Icon(Icons.arrow_right), trailing: Icon(Icons.arrow_right),
leading: voucher.type == VoucherTypePayment leading: voucher.type == VoucherTypePayment
? Icon( ? Icon(
@ -106,7 +106,7 @@ class _HistoryViewState extends State<HistoryView> {
Text buildText(Voucher voucher) { Text buildText(Voucher voucher) {
if (voucher.type == VoucherTypePayment || voucher.type == VoucherTypeReturnPay) { if (voucher.type == VoucherTypePayment || voucher.type == VoucherTypeReturnPay) {
return Text( return Text(
'${voucher.name} на сумму: ${voucher.total.toStringAsFixed(2)}'); '${voucher.name} на сумму: ${voucher.total?.toStringAsFixed(2)}');
} }
return Text('${voucher.name}'); return Text('${voucher.name}');
} }

View File

@ -11,17 +11,18 @@ class BottomBar extends StatelessWidget {
final int selectedTabIndex; final int selectedTabIndex;
BottomBar({ BottomBar({
this.pageController, required this.pageController,
this.selectedTabIndex, required this.selectedTabIndex,
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StoreConnector<AppState, SettingState>( return StoreConnector<AppState, SettingState>(
converter: (store) => store.state.settingState, converter: (store) => store.state.settingState!,
builder: (context, vm) { builder: (context, vm) {
return BottomNavigationBar( return BottomNavigationBar(
currentIndex: selectedTabIndex, currentIndex: selectedTabIndex,
showUnselectedLabels: true,
backgroundColor: menuColor, backgroundColor: menuColor,
type: BottomNavigationBarType.shifting, type: BottomNavigationBarType.shifting,
items: [ items: [

View File

@ -11,7 +11,7 @@ class HeaderTitle extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StoreConnector<AppState, UserState>( return StoreConnector<AppState, UserState>(
converter: (store) => store.state.userState, converter: (store) => store.state.userState!,
builder: (context, vm) { builder: (context, vm) {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
@ -30,7 +30,7 @@ class HeaderTitle extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Text( Text(
'Пользователь: ${vm.user.email}', 'Пользователь: ${vm.user?.email}',
overflow: TextOverflow.fade, overflow: TextOverflow.fade,
maxLines: 1, maxLines: 1,
softWrap: false, softWrap: false,
@ -39,10 +39,10 @@ class HeaderTitle extends StatelessWidget {
color: Colors.black, color: Colors.black,
), ),
), ),
vm.smena.message != null vm.smena?.message != null
? Text(vm.smena.message, ? Text(vm.smena!.message!,
style: TextStyle(fontSize: 13, color: redColor)) style: TextStyle(fontSize: 13, color: redColor))
: vm.smena.startedAt != null : vm.smena!.startedAt != null
? Text( ? Text(
'Смена открыта', 'Смена открыта',
overflow: TextOverflow.fade, overflow: TextOverflow.fade,

View File

@ -15,7 +15,7 @@ const List<Choice> choices = const <Choice>[
class PopupMenu extends StatelessWidget { class PopupMenu extends StatelessWidget {
final void Function(Choice value) onSelectChoice; final void Function(Choice value) onSelectChoice;
PopupMenu({this.onSelectChoice}); PopupMenu({required this.onSelectChoice});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -34,8 +34,8 @@ class HomeView extends StatefulWidget {
class _HomeViewState extends State<HomeView> with WidgetsBindingObserver { class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
Logger log = getLogger('HomeView'); Logger log = getLogger('HomeView');
PageController pageController; late PageController pageController;
int selectedTabIndex; late int selectedTabIndex;
DataService _dataService = locator<DataService>(); DataService _dataService = locator<DataService>();
ApiService _api = locator<ApiService>(); ApiService _api = locator<ApiService>();
NavigatorService _navigatorService = locator<NavigatorService>(); NavigatorService _navigatorService = locator<NavigatorService>();
@ -55,8 +55,8 @@ class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
final prevState = sp.getInt(lastKnownStateKey); final prevState = sp.getInt(lastKnownStateKey);
final prevStateIsNotPaused = prevState != null && final prevStateIsNotPaused = prevState != null &&
AppLifecycleState.values[prevState] != AppLifecycleState.paused; AppLifecycleState.values[prevState] != AppLifecycleState.paused;
final bool pinIsExist = Redux.store.state.settingState?.pinCode?.isNotEmpty; final bool pinIsExist = Redux.store!.state.settingState?.pinCode != null;
final bool pinSkipped = Redux.store.state.settingState.pinSkip; final bool pinSkipped = Redux.store!.state.settingState?.pinSkip == true;
print('prevStateIsNotPaused=$prevStateIsNotPaused, pinIsExist=$pinIsExist, pinSkipped=$pinSkipped'); print('prevStateIsNotPaused=$prevStateIsNotPaused, pinIsExist=$pinIsExist, pinSkipped=$pinSkipped');
if(prevStateIsNotPaused && pinSkipped == false && pinIsExist == true) { if(prevStateIsNotPaused && pinSkipped == false && pinIsExist == true) {
// save App backgrounded time to Shared preferences // save App backgrounded time to Shared preferences
@ -72,7 +72,7 @@ class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
final allowedBackgroundTime = bgTime + pinLockMillis; final allowedBackgroundTime = bgTime + pinLockMillis;
final shouldShowPIN = DateTime.now().millisecondsSinceEpoch > allowedBackgroundTime; final shouldShowPIN = DateTime.now().millisecondsSinceEpoch > allowedBackgroundTime;
if(shouldShowPIN && bgTime > 0) { if(shouldShowPIN && bgTime > 0) {
await Redux.store.dispatch(changePinLockedFromSetting(true)); await Redux.store!.dispatch(changePinLockedFromSetting(true));
pushToLockScreen(); pushToLockScreen();
} }
sp.remove(backgroundedTimeKey); // clean sp.remove(backgroundedTimeKey); // clean
@ -86,14 +86,14 @@ class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
onWillPop: () async { onWillPop: () async {
return false; return false;
}, },
child: PassCodeScreen( title: 'Áåçîïàñíîñòü',) child: PassCodeScreen( title: 'Безопасность',)
) )
)); ));
} }
_checkLockPin () async { _checkLockPin () async {
final bool pinIsExist = Redux.store.state.settingState?.pinCode?.isNotEmpty; final bool pinIsExist = Redux.store!.state.settingState?.pinCode != null;
final bool pinLocked = Redux.store.state.settingState?.pinLocked; final bool pinLocked = Redux.store!.state.settingState?.pinLocked == true;
final sp = await SharedPreferences.getInstance(); final sp = await SharedPreferences.getInstance();
sp.remove(backgroundedTimeKey); sp.remove(backgroundedTimeKey);
sp.setInt(lastKnownStateKey, AppLifecycleState.resumed.index);// previous state sp.setInt(lastKnownStateKey, AppLifecycleState.resumed.index);// previous state
@ -106,11 +106,11 @@ class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance!.addObserver(this);
selectedTabIndex = 0; selectedTabIndex = 0;
pageController = new PageController(initialPage: selectedTabIndex); pageController = new PageController(initialPage: selectedTabIndex);
Redux.store.dispatch(checkSmena); Redux.store!.dispatch(checkSmena);
_dataService.checkDbFill(Redux.store.state.userState.user); _dataService.checkDbFill(Redux.store!.state.userState!.user!);
_checkLockPin(); _checkLockPin();
} }
@ -135,7 +135,7 @@ class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
@override @override
void dispose() { void dispose() {
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance!.removeObserver(this);
pageController.dispose(); pageController.dispose();
super.dispose(); super.dispose();
} }
@ -143,11 +143,11 @@ class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
void _onSelectChoice(Choice choice) async { void _onSelectChoice(Choice choice) async {
if (choice.command == 'exit') { if (choice.command == 'exit') {
Dialogs.showLoadingDialog(context, _keyLoader); Dialogs.showLoadingDialog(context, _keyLoader);
Response<dynamic> result = await _api.logout(Redux.store.state.userState.user.token); Response<dynamic> result = await _api.logout(Redux.store!.state.userState!.user!.token!);
if(result.operation && result.status == 200) { if(result.operation && result.status == 200) {
Redux.store.dispatch(logoutAction); Redux.store!.dispatch(logoutAction);
} }
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
} else if (choice.command == 'infokkm') { } else if (choice.command == 'infokkm') {
_navigatorService.push(InfoKkmViewRoute); _navigatorService.push(InfoKkmViewRoute);
} else if (choice.command == 'settings') { } else if (choice.command == 'settings') {
@ -172,7 +172,7 @@ class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
backgroundColor: fillColor, backgroundColor: fillColor,
), ),
body:StoreConnector<AppState, SettingState>( body:StoreConnector<AppState, SettingState>(
converter: (store) => store.state.settingState, converter: (store) => store.state.settingState!,
builder: (context, vm) { builder: (context, vm) {
return PageView( return PageView(
pageSnapping: true, pageSnapping: true,

View File

@ -44,13 +44,13 @@ class _AdditionalTabState extends State<AdditionalTab> {
DataService _dataService = locator<DataService>(); DataService _dataService = locator<DataService>();
final GlobalKey<State> _keyLoader = new GlobalKey<State>(); final GlobalKey<State> _keyLoader = new GlobalKey<State>();
bool isMoneyCheckBusy; late bool isMoneyCheckBusy;
bool closeSmenaBusy; late bool closeSmenaBusy;
bool openSmenaBusy; late bool openSmenaBusy;
bool depositBusy; late bool depositBusy;
bool withdrawalBusy; late bool withdrawalBusy;
bool xReportBusy; late bool xReportBusy;
bool updateCatalog; late bool updateCatalog;
@override @override
void initState() { void initState() {
@ -69,7 +69,7 @@ class _AdditionalTabState extends State<AdditionalTab> {
closeSmenaBusy = true; closeSmenaBusy = true;
}); });
try { try {
await Redux.store.dispatch(closeSmena); await Redux.store!.dispatch(closeSmena);
} catch (e) { } catch (e) {
print(e); print(e);
} finally { } finally {
@ -84,7 +84,7 @@ class _AdditionalTabState extends State<AdditionalTab> {
openSmenaBusy = true; openSmenaBusy = true;
}); });
try { try {
await Redux.store.dispatch(openSmena); await Redux.store!.dispatch(openSmena);
} catch (e) { } catch (e) {
print(e); print(e);
} finally { } finally {
@ -99,15 +99,15 @@ class _AdditionalTabState extends State<AdditionalTab> {
xReportBusy = true; xReportBusy = true;
}); });
try { try {
User user = Redux.store.state.userState.user; User user = Redux.store!.state.userState!.user!;
Response response = await _api.xReport(user.token); Response response = await _api.xReport(user.token!);
if (response.operation) { if (response.operation) {
String check = response.body['check']; String check = response.body['check'];
var checkText = response.body['check_text']; var checkText = response.body['check_text'];
_navigator.push(ImageShowRoute, _navigator.push(ImageShowRoute,
arguments: arguments:
ImageShowModel(data: CheckImageModal(base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ), title: 'X Отчет')); ImageShowModel(data: CheckImageModal(base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ), title: 'X Отчет'));
String url = response?.body['link']; String url = response.body['link'];
_dataService.insertVoucher( _dataService.insertVoucher(
user: user, user: user,
name: 'X Отчет', name: 'X Отчет',
@ -132,8 +132,8 @@ class _AdditionalTabState extends State<AdditionalTab> {
}); });
try { try {
Dialogs.showLoadingDialog(context, _keyLoader); Dialogs.showLoadingDialog(context, _keyLoader);
await _dataService.getDataFromServer(Redux.store.state.userState.user); await _dataService.getDataFromServer(Redux.store!.state.userState!.user!);
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
} catch (e) { } catch (e) {
print(e); print(e);
} finally { } finally {
@ -155,10 +155,10 @@ class _AdditionalTabState extends State<AdditionalTab> {
); );
if (response.confirmed) { if (response.confirmed) {
Response<dynamic> result = await _api.deposit( Response<dynamic> result = await _api.deposit(
Redux.store.state.userState.user.token, response.responseText); Redux.store!.state.userState!.user!.token!, response.responseText!);
_dialog.showDialog(description: result.body['message']); _dialog.showDialog(description: result.body['message']);
if (result.operation) { if (result.operation) {
await Redux.store.dispatch(checkMoney); await Redux.store!.dispatch(checkMoney);
} }
} }
} catch (e) { } catch (e) {
@ -182,10 +182,10 @@ class _AdditionalTabState extends State<AdditionalTab> {
); );
if (response.confirmed) { if (response.confirmed) {
Response<dynamic> result = await _api.withdrawal( Response<dynamic> result = await _api.withdrawal(
Redux.store.state.userState.user.token, response.responseText); Redux.store!.state.userState!.user!.token!, response.responseText!);
_dialog.showDialog(description: result.body['message']); _dialog.showDialog(description: result.body['message']);
if (result.operation) { if (result.operation) {
await Redux.store.dispatch(checkMoney); await Redux.store!.dispatch(checkMoney);
} }
} }
} catch (e) { } catch (e) {
@ -202,7 +202,7 @@ class _AdditionalTabState extends State<AdditionalTab> {
isMoneyCheckBusy = true; isMoneyCheckBusy = true;
}); });
try { try {
await Redux.store.dispatch(checkMoney); await Redux.store!.dispatch(checkMoney);
setState(() { setState(() {
isMoneyCheckBusy = false; isMoneyCheckBusy = false;
}); });
@ -226,7 +226,7 @@ class _AdditionalTabState extends State<AdditionalTab> {
right: 20.0, right: 20.0,
), ),
child: StoreConnector<AppState, SettingState>( child: StoreConnector<AppState, SettingState>(
converter: (store) => store.state.settingState, converter: (store) => store.state.settingState!,
builder: (context, vm) { builder: (context, vm) {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -272,7 +272,7 @@ class _AdditionalTabState extends State<AdditionalTab> {
height: 50, height: 50,
width: double.infinity, width: double.infinity,
child: StoreConnector<AppState, Money>( child: StoreConnector<AppState, Money>(
converter: (store) => store.state.userState.money, converter: (store) => store.state.userState!.money!,
builder: (_, vm) { builder: (_, vm) {
if (vm.loading == true) { if (vm.loading == true) {
return Center( return Center(
@ -395,6 +395,6 @@ class _AdditionalTabState extends State<AdditionalTab> {
} }
void changeMode(el) { void changeMode(el) {
Redux.store.dispatch(changeModeFromSetting(el)); Redux.store!.dispatch(changeModeFromSetting(el));
} }
} }

View File

@ -28,10 +28,10 @@ class CalculatorTab extends StatelessWidget {
body: Column( body: Column(
children: <Widget>[ children: <Widget>[
StoreConnector<AppState, CalcState>( StoreConnector<AppState, CalcState>(
converter: (store) => store.state.calcState, converter: (store) => store.state.calcState!,
builder: (context, vm) { builder: (context, vm) {
return NumberDisplay( return NumberDisplay(
value: Calculator.parseItems(vm.calcItems, vm.isEqual)); value: Calculator.parseItems(vm.calcItems!, vm.isEqual!));
}), }),
CalculatorButtons(onTap: _onPress), CalculatorButtons(onTap: _onPress),
Row( Row(
@ -74,7 +74,7 @@ class CalculatorTab extends StatelessWidget {
)); ));
} }
void _onPress({String buttonText}) { void _onPress({required String buttonText}) {
Redux.store.dispatch(onTapAction(buttonText)); Redux.store!.dispatch(onTapAction(buttonText));
} }
} }

View File

@ -17,10 +17,10 @@ import 'package:aman_kassa_flutter/views/home/tabs/kassaView/CatalogBottomSheet.
import 'package:aman_kassa_flutter/views/home/tabs/kassaView/ProductAddBottomSheet.dart'; import 'package:aman_kassa_flutter/views/home/tabs/kassaView/ProductAddBottomSheet.dart';
import 'package:aman_kassa_flutter/views/payment/payment_view.dart'; import 'package:aman_kassa_flutter/views/payment/payment_view.dart';
import 'package:aman_kassa_flutter/widgets/components/ProductListItem.dart'; import 'package:aman_kassa_flutter/widgets/components/ProductListItem.dart';
import 'package:barcode_scan/gen/protos/protos.pb.dart'; import 'package:barcode_scan2/gen/protos/protos.pb.dart';
import 'package:barcode_scan/gen/protos/protos.pbenum.dart'; import 'package:barcode_scan2/gen/protos/protos.pbenum.dart';
import 'package:barcode_scan/model/scan_options.dart'; import 'package:barcode_scan2/model/scan_options.dart';
import 'package:barcode_scan/platform_wrapper.dart'; import 'package:barcode_scan2/platform_wrapper.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
@ -103,12 +103,12 @@ class KassaTab extends StatelessWidget {
Expanded( Expanded(
child: Container( child: Container(
child: StoreConnector<AppState, KassaState>( child: StoreConnector<AppState, KassaState>(
converter: (store) => store.state.kassaState, converter: (store) => store.state.kassaState!,
builder: (context, vm) { builder: (context, vm) {
return ListView.builder( return ListView.builder(
itemCount: vm.kassaItems.length, itemCount: vm.kassaItems!.length,
itemBuilder: (BuildContext ctxt, int index) => itemBuilder: (BuildContext ctxt, int index) =>
buildItem(ctxt, index, vm.kassaItems[index])); buildItem(ctxt, index, vm.kassaItems![index]));
}), }),
), ),
), ),
@ -119,9 +119,9 @@ class KassaTab extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[ children: <Widget>[
StoreConnector<AppState, KassaState>( StoreConnector<AppState, KassaState>(
converter: (store) => store.state.kassaState, converter: (store) => store.state.kassaState!,
builder: (context, vm) { builder: (context, vm) {
return Text(totalCalc(vm.kassaItems), return Text(totalCalc(vm.kassaItems!),
style: TextStyle(fontSize: 25)); style: TextStyle(fontSize: 25));
}), }),
], ],
@ -184,7 +184,7 @@ class KassaTab extends StatelessWidget {
Future<void> scan() async { Future<void> scan() async {
try { try {
await Redux.store.dispatch(changePinSkipFromSetting(true)); await Redux.store!.dispatch(changePinSkipFromSetting(true));
var options = ScanOptions(strings: { var options = ScanOptions(strings: {
"cancel": 'Отмена', "cancel": 'Отмена',
"flash_on": 'Вкл фонарик', "flash_on": 'Вкл фонарик',
@ -197,8 +197,8 @@ class KassaTab extends StatelessWidget {
// print(result.formatNote); // If a unknown format was scanned this field contains a note // print(result.formatNote); // If a unknown format was scanned this field contains a note
// print(result.rawContent); // content // print(result.rawContent); // content
if (result.type == ResultType.Barcode ) { if (result.type == ResultType.Barcode ) {
String barcode; String? barcode;
String dataMatrix; String? dataMatrix;
if(result.format == BarcodeFormat.ean13 || result.format == BarcodeFormat.ean8) { if(result.format == BarcodeFormat.ean13 || result.format == BarcodeFormat.ean8) {
barcode = result.rawContent; barcode = result.rawContent;
} else if( result.format == BarcodeFormat.dataMatrix ) { } else if( result.format == BarcodeFormat.dataMatrix ) {
@ -219,7 +219,7 @@ class KassaTab extends StatelessWidget {
List<Good> goods = List<Good> goods =
await _dataService.getGoodsByBarcode(barcode: barcode); await _dataService.getGoodsByBarcode(barcode: barcode);
if (goods != null && goods.isNotEmpty) { if (goods != null && goods.isNotEmpty) {
await Redux.store.dispatch(addProductToKassaItems(goods.first, dataMatrix)); await Redux.store!.dispatch(addProductToKassaItems(goods.first, dataMatrix));
} else { } else {
_dialogService.showDialog( _dialogService.showDialog(
description: 'Товар не найден: $barcode'); description: 'Товар не найден: $barcode');
@ -241,7 +241,7 @@ class KassaTab extends StatelessWidget {
_dialogService.showDialog(description: 'Неизвестная ошибка: $e'); _dialogService.showDialog(description: 'Неизвестная ошибка: $e');
} }
} finally { } finally {
await Redux.store.dispatch(changePinSkipFromSetting(false)); await Redux.store!.dispatch(changePinSkipFromSetting(false));
} }
} }

View File

@ -15,20 +15,20 @@ import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
class CatalogBottomSheet extends StatelessWidget { class CatalogBottomSheet extends StatelessWidget {
final ScrollController scrollController; final ScrollController? scrollController;
CatalogBottomSheet({this.scrollController}); CatalogBottomSheet({this.scrollController});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StoreConnector<AppState, KassaState>( return StoreConnector<AppState, KassaState>(
converter: (store) => store.state.kassaState, converter: (store) => store.state.kassaState!,
onInit: (store) => Redux.store.dispatch(selectBottomElement(0)), onInit: (store) => Redux.store!.dispatch(selectBottomElement(0)),
builder: (context, vm) { builder: (context, vm) {
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
if (vm.prevCategories.length > 0) { if (vm.prevCategories!.length > 0) {
Redux.store.dispatch(backBottomElement); Redux.store!.dispatch(backBottomElement);
} else } else
Navigator.pop(context); Navigator.pop(context);
return new Future(() => false); return new Future(() => false);
@ -36,8 +36,8 @@ class CatalogBottomSheet extends StatelessWidget {
child: Scaffold( child: Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text( title: Text(
vm.prevCategories.isNotEmpty vm.prevCategories!.isNotEmpty
? vm.prevCategories?.last?.name ? vm.prevCategories!.last.name
: '', : '',
style: TextStyle(color: Colors.black45), style: TextStyle(color: Colors.black45),
), ),
@ -45,12 +45,12 @@ class CatalogBottomSheet extends StatelessWidget {
backgroundColor: whiteColor, backgroundColor: whiteColor,
elevation: 1, elevation: 1,
leading: IconButton( leading: IconButton(
icon: Icon(vm.prevCategories.length > 0 icon: Icon(vm.prevCategories!.length > 0
? Icons.arrow_back ? Icons.arrow_back
: Icons.close), : Icons.close),
onPressed: () { onPressed: () {
if (vm.prevCategories.length > 0) { if (vm.prevCategories!.length > 0) {
Redux.store.dispatch(backBottomElement); Redux.store!.dispatch(backBottomElement);
} else } else
Navigator.pop(context); Navigator.pop(context);
}, },
@ -63,11 +63,11 @@ class CatalogBottomSheet extends StatelessWidget {
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
controller: scrollController, controller: scrollController,
itemCount: vm.bottomSheetElements.length, itemCount: vm.bottomSheetElements!.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
var el = vm.bottomSheetElements[index]; var el = vm.bottomSheetElements![index];
String name; String? name;
String price; String? price;
if (el is Category) { if (el is Category) {
Category category = el; Category category = el;
name = category.name; name = category.name;
@ -86,19 +86,19 @@ class CatalogBottomSheet extends StatelessWidget {
? Icon(Icons.layers, size: 25) ? Icon(Icons.layers, size: 25)
: null, : null,
title: Text( title: Text(
name, name ?? '',
style: TextStyle(fontSize: 15), style: TextStyle(fontSize: 15),
), ),
onTap: () async { onTap: () async {
if (el is Category) { if (el is Category) {
Redux.store Redux.store!
.dispatch(selectBottomElement(el.id)); .dispatch(selectBottomElement(el.id!));
} else if (el is Good) { } else if (el is Good) {
await Redux.store await Redux.store!
.dispatch(addProductToKassaItems(el, null)); .dispatch(addProductToKassaItems(el, null));
Navigator.pop(context); Navigator.pop(context);
} else if (el is Service) { } else if (el is Service) {
await Redux.store await Redux.store!
.dispatch(addServiceToKassaItems(el)); .dispatch(addServiceToKassaItems(el));
Navigator.pop(context); Navigator.pop(context);
} }
@ -106,7 +106,7 @@ class CatalogBottomSheet extends StatelessWidget {
trailing: el is Category trailing: el is Category
? Icon(Icons.chevron_right) ? Icon(Icons.chevron_right)
: Text( : Text(
price, price ?? '',
style: TextStyle( style: TextStyle(
fontSize: 15, color: Colors.black54), fontSize: 15, color: Colors.black54),
), ),
@ -135,12 +135,12 @@ class CatalogBottomSheet extends StatelessWidget {
return Container( return Container(
margin: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 5.0), margin: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 5.0),
child: StoreConnector<AppState, KassaState>( child: StoreConnector<AppState, KassaState>(
converter: (store) => store.state.kassaState, converter: (store) => store.state.kassaState!,
builder: (_, mainState) { builder: (_, mainState) {
return StoreConnector<AppState, SettingState>( return StoreConnector<AppState, SettingState>(
converter: (store) => store.state.settingState, converter: (store) => store.state.settingState!,
builder: (_, settingState) { builder: (_, settingState) {
if (mainState.kassaItems.isNotEmpty) { if (mainState.kassaItems!.isNotEmpty) {
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
locator<DialogService>().showDialog( locator<DialogService>().showDialog(
@ -169,8 +169,8 @@ class CatalogBottomSheet extends StatelessWidget {
underline: Container( underline: Container(
height: 1, height: 1,
), ),
onChanged: (String newValue) { onChanged: (String? newValue) {
onChangeTradeType(newValue, settingState.tradeType); onChangeTradeType(newValue!, settingState.tradeType!);
}, },
items: [ items: [
DropdownMenuItem<String>( DropdownMenuItem<String>(
@ -190,8 +190,8 @@ class CatalogBottomSheet extends StatelessWidget {
void onChangeTradeType(String newValue, String oldValue) async { void onChangeTradeType(String newValue, String oldValue) async {
if (oldValue != newValue) { if (oldValue != newValue) {
await Redux.store.dispatch(changeTradeTypeFromSetting(newValue)); await Redux.store!.dispatch(changeTradeTypeFromSetting(newValue));
await Redux.store.dispatch(selectBottomElement(0)); await Redux.store!.dispatch(selectBottomElement(0));
} }
} }
} }

View File

@ -6,7 +6,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
class ProductAddBottomSheet extends StatefulWidget { class ProductAddBottomSheet extends StatefulWidget {
final ScrollController scrollController; final ScrollController? scrollController;
ProductAddBottomSheet({this.scrollController}); ProductAddBottomSheet({this.scrollController});
@ -15,9 +15,9 @@ class ProductAddBottomSheet extends StatefulWidget {
} }
class _ProductAddBottomSheetState extends State<ProductAddBottomSheet> { class _ProductAddBottomSheetState extends State<ProductAddBottomSheet> {
TextEditingController nameController; late TextEditingController nameController;
TextEditingController countController; late TextEditingController countController;
TextEditingController priceController; late TextEditingController priceController;
double sum = 0.0; double sum = 0.0;
@override @override
@ -157,7 +157,7 @@ class _ProductAddBottomSheetState extends State<ProductAddBottomSheet> {
priceController.text.isEmpty) { priceController.text.isEmpty) {
_showDialog(); _showDialog();
} else { } else {
Redux.store.dispatch(addCustomProductToKassaItems( Redux.store!.dispatch(addCustomProductToKassaItems(
nameController.text, nameController.text,
int.parse(countController.text), int.parse(countController.text),
double.parse(priceController.text), double.parse(priceController.text),

View File

@ -28,8 +28,8 @@ class _InfoKkmViewState extends State<InfoKkmView> {
setState(() { setState(() {
loading = true; loading = true;
}); });
User user = Redux.store.state.userState.user; User user = Redux.store!.state.userState!.user!;
Response<dynamic> response = await _apiService.infoKkm(user.token); Response<dynamic> response = await _apiService.infoKkm(user.token!);
if (response.operation) { if (response.operation) {
List<dynamic> list = []; List<dynamic> list = [];
for (var key in response.body.keys) { for (var key in response.body.keys) {

View File

@ -8,7 +8,7 @@ import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/services/navigator_service.dart'; import 'package:aman_kassa_flutter/core/services/navigator_service.dart';
class PassCodeScreen extends StatefulWidget { class PassCodeScreen extends StatefulWidget {
PassCodeScreen({Key key, this.title}) : super(key: key); PassCodeScreen({Key? key, required this.title}) : super(key: key);
final String title; final String title;
@ -45,7 +45,7 @@ class _PassCodeScreenState extends State<PassCodeScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var myPass = []; var myPass = [];
String _pinCode = Redux.store.state.settingState.pinCode; String _pinCode = Redux.store!.state.settingState!.pinCode!;
for (var i = 0; i < _pinCode.length; i++) { for (var i = 0; i < _pinCode.length; i++) {
myPass.add(int.parse(_pinCode[i])); myPass.add(int.parse(_pinCode[i]));
} }
@ -72,7 +72,7 @@ class _PassCodeScreenState extends State<PassCodeScreen> {
return true; return true;
}, },
onSuccess: () { onSuccess: () {
Redux.store.dispatch(changePinLockedFromSetting(false)); Redux.store!.dispatch(changePinLockedFromSetting(false));
_navigatorService.replace(HomeViewRoute); _navigatorService.replace(HomeViewRoute);
}); });
} }

View File

@ -11,27 +11,27 @@ import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/shared/ui_helpers.dart'; import 'package:aman_kassa_flutter/shared/ui_helpers.dart';
import 'package:aman_kassa_flutter/widgets/fields/busy_button.dart'; import 'package:aman_kassa_flutter/widgets/fields/busy_button.dart';
import 'package:aman_kassa_flutter/widgets/fields/input_field.dart'; import 'package:aman_kassa_flutter/widgets/fields/input_field.dart';
import 'package:barcode_scan/gen/protos/protos.pb.dart'; import 'package:barcode_scan2/gen/protos/protos.pb.dart';
import 'package:barcode_scan/gen/protos/protos.pbenum.dart'; import 'package:barcode_scan2/gen/protos/protos.pbenum.dart';
import 'package:barcode_scan/model/scan_options.dart'; import 'package:barcode_scan2/model/scan_options.dart';
import 'package:barcode_scan/platform_wrapper.dart'; import 'package:barcode_scan2/platform_wrapper.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
class LoginView extends StatefulWidget { class LoginView extends StatefulWidget {
final LoginModel loginModel; final LoginModel? loginModel;
LoginView({this.loginModel}); LoginView({ this.loginModel});
@override @override
_LoginViewState createState() => _LoginViewState(); _LoginViewState createState() => _LoginViewState();
} }
class _LoginViewState extends State<LoginView> { class _LoginViewState extends State<LoginView> {
TextEditingController emailController; late TextEditingController emailController;
TextEditingController passwordController; late TextEditingController passwordController;
final FocusNode passwordNode = new FocusNode(); final FocusNode passwordNode = new FocusNode();
@ -45,10 +45,10 @@ class _LoginViewState extends State<LoginView> {
void initState() { void initState() {
super.initState(); super.initState();
if (widget.loginModel != null && if (widget.loginModel != null &&
widget.loginModel.authType == AuthenticateTypeLogin) { widget.loginModel?.authType == AuthenticateTypeLogin) {
emailController = TextEditingController(text: widget.loginModel.login); emailController = TextEditingController(text: widget.loginModel?.login);
passwordController = passwordController =
TextEditingController(text: widget.loginModel.password); TextEditingController(text: widget.loginModel?.password);
} else { } else {
emailController = TextEditingController(); emailController = TextEditingController();
passwordController = TextEditingController(); passwordController = TextEditingController();
@ -65,7 +65,7 @@ class _LoginViewState extends State<LoginView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StoreConnector<AppState, UserState>( return StoreConnector<AppState, UserState>(
converter: (store) => store.state.userState, converter: (store) => store.state.userState!,
builder: (context, vm) { builder: (context, vm) {
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
@ -100,7 +100,7 @@ class _LoginViewState extends State<LoginView> {
controller: emailController, controller: emailController,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
nextFocusNode: passwordNode, nextFocusNode: passwordNode,
additionalNote: vm.loginFormMessage.email, additionalNote: vm.loginFormMessage?.email,
), ),
verticalSpaceSmall, verticalSpaceSmall,
InputField( InputField(
@ -108,7 +108,7 @@ class _LoginViewState extends State<LoginView> {
password: true, password: true,
controller: passwordController, controller: passwordController,
fieldFocusNode: passwordNode, fieldFocusNode: passwordNode,
additionalNote: vm.loginFormMessage.password, additionalNote: vm.loginFormMessage?.password,
enterPressed: _pressBtnEnter, enterPressed: _pressBtnEnter,
textInputAction: TextInputAction.done, textInputAction: TextInputAction.done,
), ),
@ -121,7 +121,7 @@ class _LoginViewState extends State<LoginView> {
width: 150, width: 150,
child: BusyButton( child: BusyButton(
title: 'Войти', title: 'Войти',
busy: vm.isLoading, busy: vm.isLoading ?? false,
onPressed: _pressBtnEnter, onPressed: _pressBtnEnter,
), ),
) )
@ -151,7 +151,7 @@ class _LoginViewState extends State<LoginView> {
} else { } else {
_apiService.test = false; _apiService.test = false;
} }
Redux.store Redux.store!
.dispatch(authenticate(emailController.text, passwordController.text)); .dispatch(authenticate(emailController.text, passwordController.text));
} }
@ -169,13 +169,13 @@ class _LoginViewState extends State<LoginView> {
// print(result // print(result
// .formatNote); // If a unknown format was scanned this field contains a note // .formatNote); // If a unknown format was scanned this field contains a note
if (result.type == ResultType.Barcode && if (result.type == ResultType.Barcode &&
result.rawContent?.length == 60) { result.rawContent.length == 60) {
if (result.rawContent.toLowerCase().trim().startsWith('test')) { if (result.rawContent.toLowerCase().trim().startsWith('test')) {
_apiService.test = true; _apiService.test = true;
} else { } else {
_apiService.test = false; _apiService.test = false;
} }
Redux.store.dispatch(authenticateToken(result.rawContent)); Redux.store!.dispatch(authenticateToken(result.rawContent));
} else if (result.type == ResultType.Error) { } else if (result.type == ResultType.Error) {
_dialogService.showDialog(description: 'Не верный формат QR кода'); _dialogService.showDialog(description: 'Не верный формат QR кода');
} }
@ -196,8 +196,8 @@ class _LoginViewState extends State<LoginView> {
} }
class LoginModel { class LoginModel {
final String authType; final String? authType;
final String login; final String? login;
final String password; final String? password;
LoginModel({this.authType, this.login, this.password}); LoginModel({this.authType, this.login, this.password});
} }

View File

@ -29,7 +29,7 @@ import 'package:flutter_redux/flutter_redux.dart';
class PaymentView extends StatefulWidget { class PaymentView extends StatefulWidget {
final PaymentModel model; final PaymentModel model;
const PaymentView({Key key, this.model}) : super(key: key); const PaymentView({Key? key, required this.model}) : super(key: key);
@override @override
_PaymentViewState createState() => _PaymentViewState(); _PaymentViewState createState() => _PaymentViewState();
@ -40,7 +40,7 @@ class _PaymentViewState extends State<PaymentView> {
final DataService _dataService = locator<DataService>(); final DataService _dataService = locator<DataService>();
final DialogService _dialogService = locator<DialogService>(); final DialogService _dialogService = locator<DialogService>();
final NavigatorService _navigatorService = locator<NavigatorService>(); final NavigatorService _navigatorService = locator<NavigatorService>();
bool isBusy; late bool isBusy;
@override @override
void initState() { void initState() {
@ -102,9 +102,9 @@ class _PaymentViewState extends State<PaymentView> {
StoreConnector buildStoreConnector() { StoreConnector buildStoreConnector() {
if (widget.model.mode == SettingModeCalc) { if (widget.model.mode == SettingModeCalc) {
return StoreConnector<AppState, CalcState>( return StoreConnector<AppState, CalcState>(
converter: (store) => store.state.calcState, converter: (store) => store.state.calcState!,
builder: (_, vm) { builder: (_, vm) {
return Text('${totalCalc(vm.calcItems)} тнг', return Text('${totalCalc(vm.calcItems!)} тнг',
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.black87, color: Colors.black87,
@ -112,9 +112,9 @@ class _PaymentViewState extends State<PaymentView> {
}); });
} }
return StoreConnector<AppState, KassaState>( return StoreConnector<AppState, KassaState>(
converter: (store) => store.state.kassaState, converter: (store) => store.state.kassaState!,
builder: (_, vm) { builder: (_, vm) {
return Text('${totalKassa(vm.kassaItems)} тнг', return Text('${totalKassa(vm.kassaItems!)} тнг',
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.black87, color: Colors.black87,
@ -174,16 +174,16 @@ class _PaymentViewState extends State<PaymentView> {
}); });
Dialogs.showLoadingDialog(context, _keyLoader); Dialogs.showLoadingDialog(context, _keyLoader);
try { try {
AppState _state = Redux.store.state; AppState _state = Redux.store!.state;
String _token = _state.userState.user.token; String _token = _state.userState!.user!.token!;
String _tradeType = _state.settingState.tradeType; String _tradeType = _state.settingState!.tradeType!;
String _mode = _state.settingState.mode; String _mode = _state.settingState!.mode!;
if (_mode == SettingModeCalc) { if (_mode == SettingModeCalc) {
_tradeType = SettingTradeTypeGood; _tradeType = SettingTradeTypeGood;
} }
List<ProductDao> kassaItems = _state.kassaState.kassaItems; List<ProductDao> kassaItems = _state.kassaState!.kassaItems!;
List<CalcModel> calcItems = _state.calcState.calcItems; List<CalcModel> calcItems = _state.calcState!.calcItems!;
Response<dynamic> response = await _dataService.sellOrReturn( Response<dynamic>? response = await _dataService.sellOrReturn(
token: _token, token: _token,
kassaItems: kassaItems, kassaItems: kassaItems,
paymentType: type, paymentType: type,
@ -199,34 +199,34 @@ class _PaymentViewState extends State<PaymentView> {
String message = response.body['message']; String message = response.body['message'];
String check = response.body['check']; String check = response.body['check'];
var checkText = response.body['check_text']; var checkText = response.body['check_text'];
String url = response?.body['link']; String url = response.body['link'];
print('url : $url'); print('url : $url');
if (_mode == SettingModeCalc) { if (_mode == SettingModeCalc) {
Redux.store.dispatch(cleanCalcItems); Redux.store!.dispatch(cleanCalcItems);
} else if (_mode == SettingModeKassa) { } else if (_mode == SettingModeKassa) {
Redux.store.dispatch(cleanKassaItems); Redux.store!.dispatch(cleanKassaItems);
} }
Redux.store.dispatch(checkMoney); Redux.store!.dispatch(checkMoney);
Redux.store.dispatch(openSmenaPseudo); Redux.store!.dispatch(openSmenaPseudo);
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
_navigatorService.pop(); _navigatorService.pop();
_navigatorService.push(ImageShowRoute, _navigatorService.push(ImageShowRoute,
arguments: ImageShowModel(data:new CheckImageModal(base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ), title: message, url: url )); arguments: ImageShowModel(data:new CheckImageModal(base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ), title: message, url: url ));
} else if (!response.operation && ![401,402,403,412,500].contains(response.status)) { } else if (!response.operation && ![401,402,403,412,500].contains(response.status)) {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
_dialogService.showDialog(description: response.body['message']); _dialogService.showDialog(description: response.body['message']);
} else if(!response.operation && response.body['message'] != null) { } else if(!response.operation && response.body['message'] != null) {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
_dialogService.showDialog(description: response.body['message']); _dialogService.showDialog(description: response.body['message']);
} else { } else {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
} }
} else { } else {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
} }
} catch (e) { } catch (e) {
print(e); print(e);
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop(); Navigator.of(_keyLoader.currentContext!, rootNavigator: true).pop();
} finally { } finally {
//Navigator.of(context, rootNavigator: true).pop(); //Navigator.of(context, rootNavigator: true).pop();
@ -249,7 +249,7 @@ class _PaymentViewState extends State<PaymentView> {
items.forEach((element) { items.forEach((element) {
if (element.operation == Calculations.MULTIPLY) { if (element.operation == Calculations.MULTIPLY) {
double num1 = element.num1 == null ? 0.0 : double.parse(element.num1); double num1 = element.num1 == null ? 0.0 : double.parse(element.num1);
double num2 = element.num2 == null ? 0.0 : double.parse(element.num2); double num2 = element.num2 == null ? 0.0 : double.parse(element.num2!);
total += num1 * num2; total += num1 * num2;
} else { } else {
total += element.num1 == null ? 0.0 : double.parse(element.num1); total += element.num1 == null ? 0.0 : double.parse(element.num1);
@ -262,5 +262,5 @@ class _PaymentViewState extends State<PaymentView> {
class PaymentModel { class PaymentModel {
String operationType; String operationType;
String mode; String mode;
PaymentModel({this.mode, this.operationType}); PaymentModel({required this.mode, required this.operationType});
} }

View File

@ -27,7 +27,7 @@ class _QrViewState extends State<QrView> {
body: Container( body: Container(
child: Center( child: Center(
child: QrImage( child: QrImage(
data: widget.data.url, data: widget.data.url!,
version: QrVersions.auto, version: QrVersions.auto,
size: 220.0, size: 220.0,
), ),

View File

@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
class SettingItem extends StatefulWidget { class SettingItem extends StatefulWidget {
final String name; final String? name;
final String value; final String? value;
final String title; final String title;
final Function onTap; final Function onTap;
SettingItem({Key key, this.name, this.value, this.onTap, this.title }) : super(key: key); SettingItem({Key? key, this.name, this.value, required this.onTap, required this.title }) : super(key: key);
@override @override
_SettingItemState createState() => _SettingItemState(); _SettingItemState createState() => _SettingItemState();
@ -21,16 +21,16 @@ class _SettingItemState extends State<SettingItem> {
title: Text(widget.title), title: Text(widget.title),
subtitle: Text.rich( subtitle: Text.rich(
TextSpan( TextSpan(
text: widget.name, text: widget.name ?? '',
style: TextStyle(fontWeight: FontWeight.w500), style: TextStyle(fontWeight: FontWeight.w500),
children: <TextSpan>[ children: <TextSpan>[
if(widget.value !=null) if(widget.value != null)
TextSpan(text: ' ${widget.value}', style: TextStyle(fontStyle: FontStyle.italic)), TextSpan(text: ' ${widget.value}', style: TextStyle(fontStyle: FontStyle.italic)),
], ],
) )
), ),
trailing: Icon(Icons.chevron_right), trailing: Icon(Icons.chevron_right),
onTap: widget.onTap, onTap: () => widget.onTap(),
), ),
); );
} }

View File

@ -10,65 +10,26 @@ import 'package:image/image.dart' as Im;
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
Future<Ticket> testTicket(PaperSize paper) async { Future<List<int>> testTicket(PaperSize paper) async {
final Ticket ticket = Ticket(paper);
//Uint8List encTxt11 = await CharsetConverter.encode("cp866", "Russian: Привет Мир!"); final profile = await CapabilityProfile.load();
//ticket.textEncoded(encTxt11, styles: PosStyles(codeTable: PosCodeTable.pc866_2)); final ticket = Generator(PaperSize.mm80, profile);
//ticket.textEncoded(encTxt11); List<int> bytes = [];
bytes += ticket.text(
// ticket.text('Special 1: àÀ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //А
// ticket.text('Special 1: á'.toUpperCase(), styles: PosStyles(codeTable: PosCodeTable.westEur));// Б
// ticket.text('Special 1: â', styles: PosStyles(codeTable: PosCodeTable.westEur)); //В
// ticket.text('Special 1: ã', styles: PosStyles(codeTable: PosCodeTable.westEur));// Г
// ticket.text('Special 1: äÄ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Д
// ticket.text('Special 1: å', styles: PosStyles(codeTable: PosCodeTable.westEur));// Е
// ticket.text('Special 1: æÆ', styles: PosStyles(codeTable: PosCodeTable.westEur));// Ж
// ticket.text('Special 1: ç', styles: PosStyles(codeTable: PosCodeTable.westEur));//З
// ticket.text('Special 1: èÈ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // И
// ticket.text('Special 1: éÉ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Й
// ticket.text('Special 1: ê', styles: PosStyles(codeTable: PosCodeTable.westEur));//К
// ticket.text('Special 1: ëË', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Л
// ticket.text('Special 1: ìÌ', styles: PosStyles(codeTable: PosCodeTable.westEur));// M
// ticket.text('Special 1: íÍ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Н
// ticket.text('Special 1: î', styles: PosStyles(codeTable: PosCodeTable.westEur));// О
// ticket.text('Special 1: ï', styles: PosStyles(codeTable: PosCodeTable.westEur)); // П
// ticket.text('Special 1: ð', styles: PosStyles(codeTable: PosCodeTable.westEur));// Р
// ticket.text('Special 1: ñ', styles: PosStyles(codeTable: PosCodeTable.westEur));// С
// ticket.text('Special 1: ò', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Т
// ticket.text('Special 1: óÓ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //У
// ticket.text('Special 1: ô', styles: PosStyles(codeTable: PosCodeTable.westEur));// Ф
// ticket.text('Special 1: õÕ', styles: PosStyles(codeTable: PosCodeTable.westEur));// Х
// ticket.text('Special 1: ö', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Ц
// ticket.text('Special 1: ÷', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Ч
// ticket.text('Special 1: ø', styles: PosStyles(codeTable: PosCodeTable.westEur));//Ш
// ticket.text('Special 1: ù', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Щ
// ticket.text('Special 1: ú', styles: PosStyles(codeTable: PosCodeTable.westEur));//Ъ
// ticket.text('Special 1: û', styles: PosStyles(codeTable: PosCodeTable.westEur));//Ы
// ticket.text('Special 1: üÜ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Ь
// ticket.text('Special 1: ý', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Э
// ticket.text('Special 1: þ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // ю
// ticket.text('Special 1: ÿß', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Я
// Uint8List encTxt11 = await CharsetConverter.encode("cp866", "Russian: Привет Мир!");
// //ticket.textEncoded(encTxt11, styles: PosStyles(codeTable: PosCodeTable.pc866_2));
// ticket.textEncoded(encTxt11);
ticket.text(
'Regular: aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ'); 'Regular: aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ');
//ticket.text('Special 1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //ticket.text('Special 1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ', styles: PosStyles(codeTable: PosCodeTable.westEur));
//ticket.text('Special 2: blåbærgrød', styles: PosStyles(codeTable: PosCodeTable.westEur)); //ticket.text('Special 2: blåbærgrød', styles: PosStyles(codeTable: PosCodeTable.westEur));
ticket.text('Bold text', styles: PosStyles(bold: true)); bytes += ticket.text('Bold text', styles: PosStyles(bold: true));
ticket.text('Reverse text', styles: PosStyles(reverse: true)); bytes += ticket.text('Reverse text', styles: PosStyles(reverse: true));
ticket.text('Underlined text', bytes += ticket.text('Underlined text',
styles: PosStyles(underline: true), linesAfter: 1); styles: PosStyles(underline: true), linesAfter: 1);
ticket.text('Align left', styles: PosStyles(align: PosAlign.left)); bytes += ticket.text('Align left', styles: PosStyles(align: PosAlign.left));
ticket.text('Align center', styles: PosStyles(align: PosAlign.center)); bytes += ticket.text('Align center', styles: PosStyles(align: PosAlign.center));
ticket.text('Align right', bytes += ticket.text('Align right',
styles: PosStyles(align: PosAlign.right), linesAfter: 1); styles: PosStyles(align: PosAlign.right), linesAfter: 1);
ticket.row([ bytes += ticket.row([
PosColumn( PosColumn(
text: 'col3', text: 'col3',
width: 3, width: 3,
@ -86,7 +47,7 @@ Future<Ticket> testTicket(PaperSize paper) async {
), ),
]); ]);
ticket.text('Text size 200%', bytes += ticket.text('Text size 200%',
styles: PosStyles( styles: PosStyles(
height: PosTextSize.size2, height: PosTextSize.size2,
width: PosTextSize.size2, width: PosTextSize.size2,
@ -101,64 +62,70 @@ Future<Ticket> testTicket(PaperSize paper) async {
// Print barcode // Print barcode
final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4]; final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
ticket.barcode(Barcode.upcA(barData)); bytes += ticket.barcode(Barcode.upcA(barData));
ticket.feed(2); bytes += ticket.feed(2);
ticket.cut(); bytes += ticket.cut();
return ticket; return bytes;
} }
Future<Ticket> testTicketImage(PaperSize paper) async { Future<List<int>> testTicketImage(PaperSize paper) async {
final Ticket ticket = Ticket(paper); final profile = await CapabilityProfile.load();
final ticket = Generator(paper, profile);
List<int> bytesResult = [];
// Print image // Print image
final ByteData byteData = await rootBundle.load('assets/images/check.png'); final ByteData byteData = await rootBundle.load('assets/images/check.png');
final Uint8List bytes = byteData.buffer.asUint8List(); final Uint8List bytes = byteData.buffer.asUint8List();
final Im.Image image = Im.decodeImage(bytes); final Im.Image? image = Im.decodeImage(bytes);
// Using `ESC *` // Using `ESC *`
//ticket.image(imagea); //ticket.image(imagea);
// Using `GS v 0` (obsolete) // Using `GS v 0` (obsolete)
//ticket.imageRaster(imagea); //ticket.imageRaster(imagea);
// Using `GS ( L` // Using `GS ( L`
ticket.imageRaster(image, imageFn: PosImageFn.bitImageRaster); if(image !=null) {
bytesResult += ticket.imageRaster(image, imageFn: PosImageFn.bitImageRaster);
}
//ticket.image(imagea); //ticket.image(imagea);
ticket.feed(2); bytesResult += ticket.feed(2);
ticket.cut(); bytesResult += ticket.cut();
return ticket; return bytesResult;
} }
Future<Ticket> printImageCheck(PaperSize paper, String base64Src) async { Future<List<int>> printImageCheck(PaperSize paper, String base64Src) async {
final Ticket ticket = Ticket(paper); final profile = await CapabilityProfile.load();
final ticket = Generator(paper, profile);
List<int> bytesResult = [];
final Uint8List bytes = base64Decode(base64Src); final Uint8List bytes = base64Decode(base64Src);
final Im.Image image = Im.decodeImage(bytes); final Im.Image? image = Im.decodeImage(bytes);
ticket.imageRaster(image, imageFn: PosImageFn.bitImageRaster); if(image != null) {
//ticket.image(image); bytesResult += ticket.imageRaster(image, imageFn: PosImageFn.bitImageRaster);
ticket.feed(2); }
ticket.cut(); bytesResult += ticket.feed(2);
return ticket; bytesResult += ticket.cut();
return bytesResult;
} }
Future<Ticket> printTextCheck(PaperSize paper, String encoding, var data ) async { Future<List<int>> printTextCheck(PaperSize paper, String encoding, var data ) async {
final Ticket ticket = Ticket(paper); final profile = await CapabilityProfile.load();
ticket.emptyLines(1); final ticket = Generator(paper, profile);
List<int> bytesResult = [];
String codeTable = 'CP866';
PosCodeTable codeTable;
if(encoding == SettingPrinterEncodingCp866) { if(encoding == SettingPrinterEncodingCp866) {
codeTable = PosCodeTable.pc866_2; codeTable = 'CP866';
} else if(encoding == SettingPrinterEncodingWin1251) { } else if(encoding == SettingPrinterEncodingWin1251) {
codeTable = PosCodeTable.wpc1251; codeTable = 'CP1251';
} }
ticket.setGlobalCodeTable(codeTable);
//ticket.setGlobalCodeTable(codeTable); bytesResult += ticket.emptyLines(1);
ticket.setGlobalFont(PosFontType.fontB); //ticket.setGlobalFont(PosFontType.fontB);
String qr = data['qr']; String qr = data['qr'];
@ -172,7 +139,7 @@ Future<Ticket> printTextCheck(PaperSize paper, String encoding, var data ) async
if(text is List) { if(text is List) {
Uint8List firstCol = await CharsetConverter.encode(encoding, (text).first as String); Uint8List firstCol = await CharsetConverter.encode(encoding, (text).first as String);
Uint8List lastCol = await CharsetConverter.encode(encoding, (text).last as String); Uint8List lastCol = await CharsetConverter.encode(encoding, (text).last as String);
ticket.row([ bytesResult += ticket.row([
PosColumn( PosColumn(
textEncoded: firstCol, textEncoded: firstCol,
width: 6, width: 6,
@ -187,16 +154,16 @@ Future<Ticket> printTextCheck(PaperSize paper, String encoding, var data ) async
} else { } else {
String line = text as String; String line = text as String;
if(line == 'breakline') { if(line == 'breakline') {
ticket.hr(); bytesResult += ticket.hr();
} else if(line == 'br') { } else if(line == 'br') {
ticket.emptyLines(1); bytesResult += ticket.emptyLines(1);
} else if(line.trim() == '') { } else if(line.trim() == '') {
ticket.emptyLines(1); bytesResult += ticket.emptyLines(1);
} else { } else {
line = line.replaceAll("«", '\"'); line = line.replaceAll("«", '\"');
line = line.replaceAll("»", '\"'); line = line.replaceAll("»", '\"');
Uint8List encTxt11 = await CharsetConverter.encode(encoding, line); Uint8List encTxt11 = await CharsetConverter.encode(encoding, line);
ticket.textEncoded( encTxt11, styles: PosStyles( align: center ? PosAlign.center : PosAlign.left, codeTable: codeTable )); bytesResult += ticket.textEncoded( encTxt11, styles: PosStyles( align: center ? PosAlign.center : PosAlign.left, codeTable: codeTable ));
} }
} }
} }
@ -205,7 +172,7 @@ Future<Ticket> printTextCheck(PaperSize paper, String encoding, var data ) async
//final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4]; //final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
//ticket.barcode(Barcode.upcA(barData)); //ticket.barcode(Barcode.upcA(barData));
//ticket.qrcode(qr, align: PosAlign.center); //ticket.qrcode(qr, align: PosAlign.center);
ticket.emptyLines(1); bytesResult += ticket.emptyLines(1);
const double qrSize = 200; const double qrSize = 200;
try { try {
final uiImg = await QrPainter( final uiImg = await QrPainter(
@ -217,8 +184,12 @@ Future<Ticket> printTextCheck(PaperSize paper, String encoding, var data ) async
//final pathName = '${dir.path}/qr_tmp.png'; //final pathName = '${dir.path}/qr_tmp.png';
//final qrFile = File(pathName); //final qrFile = File(pathName);
//final imgFile = await qrFile.writeAsBytes(uiImg.buffer.asUint8List()); //final imgFile = await qrFile.writeAsBytes(uiImg.buffer.asUint8List());
final img = Im.decodePng(uiImg.buffer.asUint8List()); if(uiImg !=null) {
ticket.image(img); final Im.Image? img = Im.decodePng(uiImg.buffer.asUint8List());
if(img !=null) {
bytesResult += ticket.image(img);
}
}
//ticket.qrcode(qr, size: QRSize.Size1 ); //ticket.qrcode(qr, size: QRSize.Size1 );
} catch (e) { } catch (e) {
@ -226,9 +197,9 @@ Future<Ticket> printTextCheck(PaperSize paper, String encoding, var data ) async
} }
ticket.emptyLines(1); bytesResult += ticket.emptyLines(1);
ticket.feed(1); bytesResult += ticket.feed(1);
ticket.cut(); bytesResult += ticket.cut();
return ticket; return bytesResult;
} }

View File

@ -21,8 +21,8 @@ import '../data/settings_envi.dart';
class PrinterEncodingView extends StatefulWidget { class PrinterEncodingView extends StatefulWidget {
PrinterEncodingView({Key key, this.title}) : super(key: key); PrinterEncodingView({Key? key, this.title}) : super(key: key);
final String title; final String? title;
@override @override
_PrinterEncodingViewState createState() => _PrinterEncodingViewState(); _PrinterEncodingViewState createState() => _PrinterEncodingViewState();
@ -44,7 +44,7 @@ class _PrinterEncodingViewState extends State<PrinterEncodingView> {
void _selectPrinter(String encoding, BuildContext context, ) async { void _selectPrinter(String encoding, BuildContext context, ) async {
_logger.i(encoding); _logger.i(encoding);
await Redux.store.dispatch(selectPrinterEncodingFromSetting(encoding)); await Redux.store!.dispatch(selectPrinterEncodingFromSetting(encoding));
Navigator.of(context).pop(false); Navigator.of(context).pop(false);
} }
@ -76,7 +76,7 @@ class _PrinterEncodingViewState extends State<PrinterEncodingView> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Text(encoding.values.elementAt(index) ?? ''), Text(encoding.values.elementAt(index)),
], ],
), ),
) )

View File

@ -21,8 +21,8 @@ import '../data/settings_envi.dart';
class PrinterPaperView extends StatefulWidget { class PrinterPaperView extends StatefulWidget {
PrinterPaperView({Key key, this.title}) : super(key: key); PrinterPaperView({Key? key, this.title}) : super(key: key);
final String title; final String? title;
@override @override
_PrinterEncodingViewState createState() => _PrinterEncodingViewState(); _PrinterEncodingViewState createState() => _PrinterEncodingViewState();
@ -44,7 +44,7 @@ class _PrinterEncodingViewState extends State<PrinterPaperView> {
void _selectPaper(String paperSize, BuildContext context, ) async { void _selectPaper(String paperSize, BuildContext context, ) async {
_logger.i(encoding); _logger.i(encoding);
await Redux.store.dispatch(selectPrinterPaperSizeFromSetting(paperSize)); await Redux.store!.dispatch(selectPrinterPaperSizeFromSetting(paperSize));
Navigator.of(context).pop(false); Navigator.of(context).pop(false);
} }
@ -76,7 +76,7 @@ class _PrinterEncodingViewState extends State<PrinterPaperView> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Text(paperSize.values.elementAt(index) ?? ''), Text(paperSize.values.elementAt(index)),
], ],
), ),
) )

View File

@ -21,8 +21,8 @@ import '../PrinterTest.dart';
class PrinterSelectView extends StatefulWidget { class PrinterSelectView extends StatefulWidget {
PrinterSelectView({Key key, this.title}) : super(key: key); PrinterSelectView({Key? key, this.title}) : super(key: key);
final String title; final String? title;
@override @override
_PrinterSelectViewState createState() => _PrinterSelectViewState(); _PrinterSelectViewState createState() => _PrinterSelectViewState();
@ -58,163 +58,6 @@ class _PrinterSelectViewState extends State<PrinterSelectView> {
printerManager.stopScan(); printerManager.stopScan();
} }
Future<Ticket> demoReceipt(PaperSize paper) async {
final Ticket ticket = Ticket(paper, );
// Print image
// final ByteData data = await rootBundle.load('assets/images/aman_kassa_check.png');
// final Uint8List bytes = data.buffer.asUint8List();
// final Im.Image image = Im.decodeImage(bytes);
// Im.Image thumbnail = Im.copyResize(image, width: 270);
// ticket.image(thumbnail, align: PosAlign.center);
//ticket.imageRaster(image, align: PosAlign.center);
ticket.text('AMAN-SATU',
styles: PosStyles(
align: PosAlign.center,
height: PosTextSize.size2,
width: PosTextSize.size2,
),
linesAfter: 1);
ticket.text('889 Watson Lane', styles: PosStyles(align: PosAlign.center));
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, codeTable: PosCodeTable.westEur), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, fontType: PosFontType.fontA), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, fontType: PosFontType.fontB), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, height: PosTextSize.size1), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, width: PosTextSize.size2), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, width: PosTextSize.size3), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, width: PosTextSize.size4), containsChinese: true);
ticket.text('Tel: 830-221-1234', styles: PosStyles(align: PosAlign.center));
ticket.text('Web: www.example.com',
styles: PosStyles(align: PosAlign.center), linesAfter: 1);
ticket.hr();
ticket.row([
PosColumn(text: 'Qty', width: 1),
PosColumn(text: 'Item', width: 7),
PosColumn(
text: 'Price', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: 'Total', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '2', width: 1),
PosColumn(text: 'ONION RINGS', width: 7),
PosColumn(
text: '0.99', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '1.98', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '1', width: 1),
PosColumn(text: 'PIZZA', width: 7),
PosColumn(
text: '3.45', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '3.45', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '1', width: 1),
PosColumn(text: 'SPRING ROLLS', width: 7),
PosColumn(
text: '2.99', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '2.99', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '3', width: 1),
PosColumn(text: 'CRUNCHY STICKS', width: 7),
PosColumn(
text: '0.85', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '2.55', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.hr();
ticket.row([
PosColumn(
text: 'TOTAL',
width: 6,
styles: PosStyles(
height: PosTextSize.size2,
width: PosTextSize.size2,
)),
PosColumn(
text: '\$10.97',
width: 6,
styles: PosStyles(
align: PosAlign.right,
height: PosTextSize.size2,
width: PosTextSize.size2,
)),
]);
ticket.hr(ch: '=', linesAfter: 1);
ticket.row([
PosColumn(
text: 'Cash',
width: 7,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
PosColumn(
text: '\$15.00',
width: 5,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
]);
ticket.row([
PosColumn(
text: 'Change',
width: 7,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
PosColumn(
text: '\$4.03',
width: 5,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
]);
ticket.feed(2);
ticket.text('Thank you!',
styles: PosStyles(align: PosAlign.center, bold: true));
final now = DateTime.now();
final formatter = DateFormat('MM/dd/yyyy H:m');
final String timestamp = formatter.format(now);
ticket.text(timestamp,
styles: PosStyles(align: PosAlign.center), linesAfter: 2);
// Print QR Code from image
// try {
// const String qrData = 'example.com';
// const double qrSize = 200;
// final uiImg = await QrPainter(
// data: qrData,
// version: QrVersions.auto,
// gapless: false,
// ).toImageData(qrSize);
// final dir = await getTemporaryDirectory();
// final pathName = '${dir.path}/qr_tmp.png';
// final qrFile = File(pathName);
// final imgFile = await qrFile.writeAsBytes(uiImg.buffer.asUint8List());
// final img = decodeImage(imgFile.readAsBytesSync());
// ticket.image(img);
// } catch (e) {
// print(e);
// }
// Print QR Code using native function
// ticket.qrcode('example.com');
ticket.feed(2);
ticket.cut();
return ticket;
}
void _selectPrinter(PrinterBluetooth printer, BuildContext context, ) async { void _selectPrinter(PrinterBluetooth printer, BuildContext context, ) async {
printerManager.selectPrinter(printer); printerManager.selectPrinter(printer);
_logger.i(printer.name); _logger.i(printer.name);
@ -225,7 +68,7 @@ class _PrinterSelectViewState extends State<PrinterSelectView> {
..name=printer.name ..name=printer.name
..type=printer.type; ..type=printer.type;
await Redux.store.dispatch(selectPrinterFromSetting(device)); await Redux.store!.dispatch(selectPrinterFromSetting(device));
Navigator.of(context).pop(false); Navigator.of(context).pop(false);
} }
@ -246,9 +89,6 @@ class _PrinterSelectViewState extends State<PrinterSelectView> {
queueSleepTimeMs: 50 queueSleepTimeMs: 50
); );
// DEMO RECEIPT
// final PosPrintResult res =
// await printerManager.printTicket(await demoReceipt(paper) , queueSleepTimeMs: 50);
} }
@ -283,7 +123,7 @@ class _PrinterSelectViewState extends State<PrinterSelectView> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Text(_devices[index].name ?? ''), Text(_devices[index].name ?? ''),
Text(_devices[index].address), Text(_devices[index].address ?? ''),
Text( Text(
'Click to print a test receipt', 'Click to print a test receipt',
style: TextStyle(color: Colors.grey[700]), style: TextStyle(color: Colors.grey[700]),
@ -303,7 +143,7 @@ class _PrinterSelectViewState extends State<PrinterSelectView> {
stream: printerManager.isScanningStream, stream: printerManager.isScanningStream,
initialData: false, initialData: false,
builder: (c, snapshot) { builder: (c, snapshot) {
if (snapshot.data) { if (snapshot.data != null) {
return FloatingActionButton( return FloatingActionButton(
child: Icon(Icons.stop), child: Icon(Icons.stop),
onPressed: _stopScanDevices, onPressed: _stopScanDevices,

View File

@ -53,8 +53,8 @@ class _SettingPrinterViewState extends State<SettingPrinterView> {
_printing = true; _printing = true;
}); });
try { try {
final SettingState state = Redux.store.state.settingState; final SettingState state = Redux.store!.state.settingState!;
printerManager.selectPrinter(PrinterBluetooth(state.printerBT)); printerManager.selectPrinter(PrinterBluetooth(state.printerBT!));
bool isIos = Platform.isIOS; bool isIos = Platform.isIOS;
int chunkSizeBytes = 3096; int chunkSizeBytes = 3096;
int queueSleepTimeMs = 100; int queueSleepTimeMs = 100;
@ -78,7 +78,7 @@ class _SettingPrinterViewState extends State<SettingPrinterView> {
_dialogService.showDialog(description: res.msg); _dialogService.showDialog(description: res.msg);
} else { } else {
final PosPrintResult res = await printerManager.printTicket( final PosPrintResult res = await printerManager.printTicket(
await printTextCheck(paper, state.printerEncoding, exampleJson['check_text']), await printTextCheck(paper, state.printerEncoding!, exampleJson['check_text']),
chunkSizeBytes: chunkSizeBytes, chunkSizeBytes: chunkSizeBytes,
queueSleepTimeMs: queueSleepTimeMs queueSleepTimeMs: queueSleepTimeMs
); );
@ -107,22 +107,22 @@ class _SettingPrinterViewState extends State<SettingPrinterView> {
body: Padding( body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0), padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: StoreConnector<AppState, SettingState>( child: StoreConnector<AppState, SettingState>(
converter: (store) => store.state.settingState, converter: (store) => store.state.settingState!,
builder: (context, vm) { builder: (context, vm) {
return Column( return Column(
children: [ children: [
SettingItem( SettingItem(
title: 'Принтер', title: 'Принтер',
name: vm.printerBT?.name, name: vm.printerBT?.name ?? '',
value: vm.printerBT != null value: vm.printerBT != null
? 'BT: ${vm.printerBT.address} ' ? 'BT: ${vm.printerBT?.address ?? ''} '
: 'не выбран', : 'не выбран',
onTap: () { onTap: () {
_navigatorService.push(SettingsPrinterBTRoute); _navigatorService.push(SettingsPrinterBTRoute);
}), }),
SettingItem( SettingItem(
title: 'Кодировка', title: 'Кодировка',
name: vm.printerEncoding != null ? encoding[vm.printerEncoding] : null , name: vm.printerEncoding != null ? encoding[vm.printerEncoding] : '' ,
onTap: () { onTap: () {
_navigatorService.push(SettingsPrinterEncodingRoute); _navigatorService.push(SettingsPrinterEncodingRoute);
}), }),
@ -144,9 +144,7 @@ class _SettingPrinterViewState extends State<SettingPrinterView> {
busy: _printing, busy: _printing,
enabled: vm.printerBT != null, enabled: vm.printerBT != null,
onPressed: () { onPressed: () {
_startInitialPrint(); _startInitialPrint();
}, },
), ),
], ],
@ -166,7 +164,7 @@ class _SettingPrinterViewState extends State<SettingPrinterView> {
if( Platform.isAndroid) { if( Platform.isAndroid) {
var status = await Permission.location.status; var status = await Permission.location.status;
log.i(status); log.i(status);
if (status.isUndetermined || status.isDenied || status.isPermanentlyDenied) { if ( status.isDenied || status.isPermanentlyDenied) {
DialogResponse response = await _dialogService.showConfirmationDialog( DialogResponse response = await _dialogService.showConfirmationDialog(
title: 'Доступ', title: 'Доступ',
description: 'Для поиска устройств Bluetooth необходимо предоставить доступ к отслеживанию геолокации.', description: 'Для поиска устройств Bluetooth необходимо предоставить доступ к отслеживанию геолокации.',
@ -194,7 +192,7 @@ class _SettingPrinterViewState extends State<SettingPrinterView> {
if (Platform.isIOS) { if (Platform.isIOS) {
await _testPrint(); _testPrint();
} else { } else {
bluetoothManager.state.listen((val) { bluetoothManager.state.listen((val) {
print("state = $val"); print("state = $val");

View File

@ -16,13 +16,13 @@ class SettingView extends StatefulWidget {
} }
class _SettingViewState extends State<SettingView> { class _SettingViewState extends State<SettingView> {
TextEditingController _pinController; late TextEditingController _pinController;
final DialogService _dialogService = locator<DialogService>(); final DialogService _dialogService = locator<DialogService>();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
SettingState state = Redux.store.state.settingState; SettingState state = Redux.store!.state.settingState!;
_pinController = new TextEditingController(text: state.pinCode); _pinController = new TextEditingController(text: state.pinCode);
} }
@ -41,7 +41,7 @@ class _SettingViewState extends State<SettingView> {
if(value.isNotEmpty && value.length !=4){ if(value.isNotEmpty && value.length !=4){
_dialogService.showDialog(description: 'Необходимо указать 4-х значный числовой код'); _dialogService.showDialog(description: 'Необходимо указать 4-х значный числовой код');
} else { } else {
await Redux.store.dispatch(changePinCodeFromSetting(_pinController.text)); await Redux.store!.dispatch(changePinCodeFromSetting(_pinController.text));
_dialogService.showDialog(description: 'Данные успешно сохранены'); _dialogService.showDialog(description: 'Данные успешно сохранены');
} }
} }

View File

@ -3,7 +3,6 @@ import 'package:aman_kassa_flutter/redux/state/user_state.dart';
import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
class StartUpView extends StatefulWidget { class StartUpView extends StatefulWidget {
@ -16,14 +15,14 @@ class _StartUpViewState extends State<StartUpView> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
Redux.store.dispatch(checkUserAction); Redux.store!.dispatch(checkUserAction);
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ScreenUtil.init(context, width: 411.43, height: 683.43, allowFontScaling: false);
return StoreConnector<AppState, UserState>( return StoreConnector<AppState, UserState>(
converter: (store) => store.state.userState, converter: (store) => store.state.userState!,
builder: (context, userState) { builder: (context, userState) {
return Scaffold( return Scaffold(
body: Center( body: Center(

View File

@ -9,7 +9,7 @@ class ProductListItem extends StatelessWidget {
final ProductDao item; final ProductDao item;
final int index; final int index;
ProductListItem({this.item, this.index}); ProductListItem({required this.item, required this.index});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -26,7 +26,7 @@ class ProductListItem extends StatelessWidget {
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
vertical: 8, horizontal: 4), vertical: 8, horizontal: 4),
child: Text( child: Text(
item.name ?? 'name', item.name,
style: productTextStyle, style: productTextStyle,
)), )),
), ),
@ -35,7 +35,7 @@ class ProductListItem extends StatelessWidget {
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
vertical: 8, horizontal: 4), vertical: 8, horizontal: 4),
child: Text( child: Text(
'${item.price?.toString()} x ${item.count?.toString()} = ${item.total?.toString()}', '${item.price.toString()} x ${item.count.toString()} = ${item.total.toString()}',
textAlign: TextAlign.right, textAlign: TextAlign.right,
style: productTextStyle)), style: productTextStyle)),
) )
@ -60,13 +60,13 @@ class ProductListItem extends StatelessWidget {
// }), // }),
if(item.excise == null) if(item.excise == null)
buildClipRect(primaryColor, Icons.remove, () { buildClipRect(primaryColor, Icons.remove, () {
Redux.store Redux.store!
.dispatch( .dispatch(
counterProductFromKassaItems(index, -1)); counterProductFromKassaItems(index, -1));
}), }),
if(item.excise == null) if(item.excise == null)
buildClipRect(primaryColor, Icons.add, () { buildClipRect(primaryColor, Icons.add, () {
Redux.store Redux.store!
.dispatch( .dispatch(
counterProductFromKassaItems(index, 1)); counterProductFromKassaItems(index, 1));
}), }),
@ -75,7 +75,7 @@ class ProductListItem extends StatelessWidget {
child: Container(), child: Container(),
), ),
buildClipRect(redColor, Icons.close, () { buildClipRect(redColor, Icons.close, () {
Redux.store Redux.store!
.dispatch(removeProductFromKassaItems(index)); .dispatch(removeProductFromKassaItems(index));
}), }),
], ],

View File

@ -2,13 +2,13 @@ import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/widgets/components/calculator/calculator.dart'; import 'package:aman_kassa_flutter/widgets/components/calculator/calculator.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
typedef void CalculatorButtonTapCallback({String buttonText}); typedef void CalculatorButtonTapCallback({required String buttonText});
List operationsBlue = [Calculations.ADD,Calculations.MULTIPLY,Calculations.EQUAL,Calculations.ERASE]; List operationsBlue = [Calculations.ADD,Calculations.MULTIPLY,Calculations.EQUAL,Calculations.ERASE];
List operationsRed = [Calculations.CLEAR]; List operationsRed = [Calculations.CLEAR];
class CalculatorButton extends StatelessWidget { class CalculatorButton extends StatelessWidget {
CalculatorButton({this.text, @required this.onTap}); CalculatorButton({required this.text, required this.onTap});
final String text; final String text;
final CalculatorButtonTapCallback onTap; final CalculatorButtonTapCallback onTap;

View File

@ -4,7 +4,7 @@ import 'calculator-button.dart';
import 'calculator-row.dart'; import 'calculator-row.dart';
class CalculatorButtons extends StatelessWidget { class CalculatorButtons extends StatelessWidget {
CalculatorButtons({@required this.onTap}); CalculatorButtons({required this.onTap});
final CalculatorButtonTapCallback onTap; final CalculatorButtonTapCallback onTap;
final calculatorButtonRows = [ final calculatorButtonRows = [

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'calculator-button.dart'; import 'calculator-button.dart';
class CalculatorRow extends StatelessWidget { class CalculatorRow extends StatelessWidget {
CalculatorRow({@required this.buttons, @required this.onTap }); CalculatorRow({required this.buttons, required this.onTap });
final List<String> buttons; final List<String> buttons;
final CalculatorButtonTapCallback onTap; final CalculatorButtonTapCallback onTap;

View File

@ -54,7 +54,7 @@ class Calculator {
var row = items[i]; var row = items[i];
if (row.operation == Calculations.MULTIPLY) { if (row.operation == Calculations.MULTIPLY) {
str += "${row.num1} * ${row.num2}" ; str += "${row.num1} * ${row.num2}" ;
summ += double.parse(row.num1) * double.parse(row.num2); summ += double.parse(row.num1) * double.parse(row.num2!);
} else { } else {
str += row.num1; str += row.num1;
summ += double.parse(row.num1) ; summ += double.parse(row.num1) ;
@ -85,7 +85,7 @@ class Calculator {
if (row.num2 == null) { if (row.num2 == null) {
str += row.num1 + " * "; str += row.num1 + " * ";
} else { } else {
str += row.num1 + " * " + row.num2; str += row.num1 + " * " + row.num2!;
} }
} else if (row.operation == Calculations.NONE) { } else if (row.operation == Calculations.NONE) {
str += row.num1; str += row.num1;
@ -99,7 +99,7 @@ class Calculator {
return str; return str;
} }
static List<CalcModel> action({String value, List<CalcModel> items}) { static List<CalcModel> action({required String value, required List<CalcModel> items}) {
switch (value) { switch (value) {
case Calculations.ADD: case Calculations.ADD:
{ {
@ -142,7 +142,7 @@ class Calculator {
return [...items]; return [...items];
} }
static List<CalcModel> _setNumber({String value, List<CalcModel> items}) { static List<CalcModel> _setNumber({required String value, required List<CalcModel> items}) {
if (items.isEmpty) { if (items.isEmpty) {
items.add(CalcModel(num1: value, operation: Calculations.NONE)); items.add(CalcModel(num1: value, operation: Calculations.NONE));
} else { } else {
@ -169,8 +169,9 @@ class Calculator {
} else if (last.operation == Calculations.MULTIPLY) { } else if (last.operation == Calculations.MULTIPLY) {
if(last.num2 == null) if(last.num2 == null)
last.num2 = value; last.num2 = value;
else else if(last.num2 !=null) {
last.num2 += value; last.num2 = last.num2! + value;
}
last.operation = Calculations.MULTIPLY; last.operation = Calculations.MULTIPLY;
items.add(last); items.add(last);
} else if (last.operation == Calculations.ADD) { } else if (last.operation == Calculations.ADD) {
@ -183,7 +184,7 @@ class Calculator {
return [...items]; return [...items];
} }
static List<CalcModel> _setPlus({String value, List<CalcModel> items}) { static List<CalcModel> _setPlus({required String value, required List<CalcModel> items}) {
if (items.isNotEmpty) { if (items.isNotEmpty) {
CalcModel last = items.removeLast(); CalcModel last = items.removeLast();
if (last.closed) { if (last.closed) {
@ -212,11 +213,11 @@ class Calculator {
return [...items]; return [...items];
} }
static List<CalcModel> _setDot({String value, List<CalcModel> items}) { static List<CalcModel> _setDot({required String value, required List<CalcModel> items}) {
if (items.isNotEmpty) { if (items.isNotEmpty) {
CalcModel last = items.removeLast(); CalcModel last = items.removeLast();
if (last.operation == Calculations.NONE) { if (last.operation == Calculations.NONE) {
if (last.num1?.contains('.') == false) { if (last.num1.contains('.') == false) {
last.num1 += '.'; last.num1 += '.';
} }
last.operation = Calculations.NONE; last.operation = Calculations.NONE;
@ -226,10 +227,10 @@ class Calculator {
items.add(CalcModel(num1: '0.', operation: Calculations.NONE)); items.add(CalcModel(num1: '0.', operation: Calculations.NONE));
} else if (last.operation == Calculations.MULTIPLY) { } else if (last.operation == Calculations.MULTIPLY) {
if (last.num2 == null) { if (last.num2 == null) {
last.num2 += '0.'; last.num2 = last.num2! + '0.';
} else { } else {
if (last.num2?.contains('.') == false) { if (last.num2?.contains('.') == false) {
last.num2 += '.'; last.num2 = last.num2! + '.';
} }
} }
last.operation = Calculations.MULTIPLY; last.operation = Calculations.MULTIPLY;
@ -241,11 +242,11 @@ class Calculator {
return [...items]; return [...items];
} }
static List<CalcModel> _setClean({String value, List<CalcModel> items}) { static List<CalcModel> _setClean({required String value, required List<CalcModel> items}) {
return []; return [];
} }
static List<CalcModel> _setEqual({String value, List<CalcModel> items}) { static List<CalcModel> _setEqual({required String value, required List<CalcModel> items}) {
if (items.isNotEmpty) { if (items.isNotEmpty) {
CalcModel last = items.removeLast(); CalcModel last = items.removeLast();
last.operation = Calculations.EQUAL; last.operation = Calculations.EQUAL;
@ -254,7 +255,7 @@ class Calculator {
return [...items]; return [...items];
} }
static List<CalcModel> _setMultiply({String value, List<CalcModel> items}) { static List<CalcModel> _setMultiply({required String value, required List<CalcModel> items}) {
if (items.isNotEmpty) { if (items.isNotEmpty) {
CalcModel last = items.removeLast(); CalcModel last = items.removeLast();
if (last.closed) { if (last.closed) {
@ -282,7 +283,7 @@ class Calculator {
return [...items]; return [...items];
} }
static List<CalcModel> _setBackward({String value, List<CalcModel> items}) { static List<CalcModel> _setBackward({required String value, required List<CalcModel> items}) {
if (items.isNotEmpty) { if (items.isNotEmpty) {
items.removeLast(); items.removeLast();
} }

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
class NumberDisplay extends StatelessWidget { class NumberDisplay extends StatelessWidget {
NumberDisplay({this.value}); NumberDisplay({required this.value});
final String value; final String value;

View File

@ -7,16 +7,16 @@ import 'package:flutter/services.dart';
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart'; import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
class DialogManager extends StatefulWidget { class DialogManager extends StatefulWidget {
final Widget child; final Widget? child;
DialogManager({Key key, this.child}) : super(key: key); DialogManager({Key? key, this.child}) : super(key: key);
_DialogManagerState createState() => _DialogManagerState(); _DialogManagerState createState() => _DialogManagerState();
} }
class _DialogManagerState extends State<DialogManager> { class _DialogManagerState extends State<DialogManager> {
final DialogService _dialogService = locator<DialogService>(); final DialogService _dialogService = locator<DialogService>();
TextEditingController _controller; late TextEditingController _controller;
@override @override
void initState() { void initState() {
@ -33,7 +33,7 @@ class _DialogManagerState extends State<DialogManager> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return widget.child; return widget.child ?? Container();
} }
void _showDialog(DialogRequest request) { void _showDialog(DialogRequest request) {
@ -59,7 +59,7 @@ class _DialogManagerState extends State<DialogManager> {
actions: <Widget>[ actions: <Widget>[
if (isConfirmationDialog) if (isConfirmationDialog)
FlatButton( FlatButton(
child: Text(request.cancelTitle), child: Text(request.cancelTitle!),
onPressed: () { onPressed: () {
_dialogService _dialogService
.dialogComplete(DialogResponse(confirmed: false)); .dialogComplete(DialogResponse(confirmed: false));
@ -132,7 +132,7 @@ class _DialogManagerState extends State<DialogManager> {
RaisedButton( RaisedButton(
color: redColor, color: redColor,
child: Text( child: Text(
request.cancelTitle, request.cancelTitle!,
style: TextStyle(fontSize: 18), style: TextStyle(fontSize: 18),
), ),
onPressed: () { onPressed: () {
@ -163,7 +163,7 @@ class _DialogManagerState extends State<DialogManager> {
dialogController.whenComplete(() { dialogController.whenComplete(() {
//hook when press overlay and response not completed //hook when press overlay and response not completed
if (_dialogService.completer != null) { if (_dialogService.completer != null) {
_dialogService.completer.complete(DialogResponse(confirmed: false)); _dialogService.completer!.complete(DialogResponse(confirmed: false));
} }
}); });
} }

View File

@ -11,12 +11,12 @@ class AmanIconButton extends StatefulWidget {
final IconData icon; final IconData icon;
const AmanIconButton( const AmanIconButton(
{ {
@required this.title, required this.title,
this.busy = false, this.busy = false,
@required this.onPressed, required this.onPressed,
this.enabled = true, this.enabled = true,
this.mainColor, required this.mainColor,
@required this.icon required this.icon
}); });
@override @override
@ -29,7 +29,7 @@ class _AmanIconButtonState extends State<AmanIconButton> {
return GestureDetector( return GestureDetector(
child: InkWell( child: InkWell(
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
onTap: widget.busy ? () {} : widget.onPressed, onTap: widget.busy ? () {} : () => widget.onPressed(),
child: Container( child: Container(
//height: 75, //height: 75,
width: 120, width: 120,

View File

@ -10,13 +10,14 @@ class AmanIconButtonHorizontal extends StatefulWidget {
final Color inactiveColor; final Color inactiveColor;
final bool selected; final bool selected;
final IconData icon; final IconData icon;
const AmanIconButtonHorizontal( const AmanIconButtonHorizontal(
{@required this.title, {required this.title,
this.onPressed, required this.onPressed,
this.activeColor = primaryColor, this.activeColor = primaryColor,
this.inactiveColor = Colors.black26, this.inactiveColor = Colors.black26,
this.selected = false, this.selected = false,
@required this.icon}); required this.icon});
@override @override
_AmanIconButtonHorizontalState createState() => _AmanIconButtonHorizontalState createState() =>
@ -29,7 +30,7 @@ class _AmanIconButtonHorizontalState extends State<AmanIconButtonHorizontal> {
return GestureDetector( return GestureDetector(
child: InkWell( child: InkWell(
borderRadius: BorderRadius.circular(3), borderRadius: BorderRadius.circular(3),
onTap: widget.onPressed, onTap: () => widget.onPressed(),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[

View File

@ -9,12 +9,12 @@ class BusyButton extends StatefulWidget {
final String title; final String title;
final Function onPressed; final Function onPressed;
final bool enabled; final bool enabled;
final Color mainColor; final Color? mainColor;
const BusyButton({ const BusyButton({
@required this.title, required this.title,
this.busy = false, this.busy = false,
@required this.onPressed, required this.onPressed,
this.enabled = true, this.enabled = true,
this.mainColor, this.mainColor,
}); });
@ -38,7 +38,7 @@ class _BusyButtonState extends State<BusyButton> {
child: Material( child: Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: InkWell( child: InkWell(
onTap: widget.busy || !widget.enabled ? null : widget.onPressed, onTap: widget.busy || !widget.enabled ? null : () => widget.onPressed(),
child: AnimatedContainer( child: AnimatedContainer(
height: widget.busy ? 45 : 45, height: widget.busy ? 45 : 45,
//width: widget.busy ? 40 : 40, //width: widget.busy ? 40 : 40,

View File

@ -8,16 +8,16 @@ class BusyButtonIcon extends StatefulWidget {
final String title; final String title;
final Function onPressed; final Function onPressed;
final bool enabled; final bool enabled;
final Color mainColor; final Color? mainColor;
final IconData icon; final IconData icon;
const BusyButtonIcon( const BusyButtonIcon(
{@required this.title, {required this.title,
this.busy = false, this.busy = false,
@required this.onPressed, required this.onPressed,
this.enabled = true, this.enabled = true,
this.mainColor, this.mainColor,
this.icon}); required this.icon});
@override @override
_BusyButtonIconState createState() => _BusyButtonIconState(); _BusyButtonIconState createState() => _BusyButtonIconState();
@ -38,7 +38,7 @@ class _BusyButtonIconState extends State<BusyButtonIcon> {
child: Material( child: Material(
type: MaterialType.transparency, type: MaterialType.transparency,
child: InkWell( child: InkWell(
onTap: widget.busy || !widget.enabled ? null : widget.onPressed, onTap: widget.busy || !widget.enabled ? null : () => widget.onPressed(),
child: AnimatedContainer( child: AnimatedContainer(
height: widget.busy ? 45 : 45, height: widget.busy ? 45 : 45,
//width: widget.busy ? 40 : 40, //width: widget.busy ? 40 : 40,
@ -68,7 +68,9 @@ class _BusyButtonIconState extends State<BusyButtonIcon> {
Text( Text(
widget.title, widget.title,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: widget.enabled ? buttonTitleTextStyle : buttonTitleDisableTextStyle, style: widget.enabled
? buttonTitleTextStyle
: buttonTitleDisableTextStyle,
maxLines: 1, maxLines: 1,
), ),
], ],

View File

@ -12,23 +12,23 @@ class InputField extends StatefulWidget {
final bool password; final bool password;
final bool isReadOnly; final bool isReadOnly;
final String placeholder; final String placeholder;
final String validationMessage; final String? validationMessage;
final Function enterPressed; final Function? enterPressed;
final bool smallVersion; final bool smallVersion;
final FocusNode fieldFocusNode; final FocusNode? fieldFocusNode;
final FocusNode nextFocusNode; final FocusNode? nextFocusNode;
final TextInputAction textInputAction; final TextInputAction textInputAction;
final bool multiline; final bool multiline;
final String additionalNote; final String? additionalNote;
final Function(String) onChanged; final Function(String)? onChanged;
final TextInputFormatter formatter; final TextInputFormatter? formatter;
final String initialValue; final String? initialValue;
final String labelText; final String? labelText;
InputField( InputField(
{ {
this.controller, required this.controller,
@required this.placeholder, required this.placeholder,
this.enterPressed, this.enterPressed,
this.fieldFocusNode, this.fieldFocusNode,
this.nextFocusNode, this.nextFocusNode,
@ -49,7 +49,7 @@ class InputField extends StatefulWidget {
} }
class _InputFieldState extends State<InputField> { class _InputFieldState extends State<InputField> {
bool isPassword; bool isPassword = false;
double fieldHeight = 55; double fieldHeight = 55;
@override @override
@ -63,7 +63,7 @@ class _InputFieldState extends State<InputField> {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
if (widget.labelText != null) NoteText(widget.labelText), if (widget.labelText != null) NoteText(widget.labelText!),
Container( Container(
//height: widget.smallVersion ? 40 : fieldHeight, //height: widget.smallVersion ? 40 : fieldHeight,
constraints: BoxConstraints(minHeight: widget.smallVersion ? 40 : fieldHeight), constraints: BoxConstraints(minHeight: widget.smallVersion ? 40 : fieldHeight),
@ -84,16 +84,16 @@ class _InputFieldState extends State<InputField> {
onChanged: widget.onChanged, onChanged: widget.onChanged,
initialValue: widget.initialValue, initialValue: widget.initialValue,
inputFormatters: inputFormatters:
widget.formatter != null ? [widget.formatter] : null, widget.formatter != null ? [widget.formatter!] : null,
onEditingComplete: () { onEditingComplete: () {
if (widget.enterPressed != null) { if (widget.enterPressed != null) {
FocusScope.of(context).requestFocus(FocusNode()); FocusScope.of(context).requestFocus(FocusNode());
widget.enterPressed(); widget.enterPressed!();
} }
}, },
onFieldSubmitted: (value) { onFieldSubmitted: (value) {
if (widget.nextFocusNode != null) { if (widget.nextFocusNode != null) {
widget.nextFocusNode.requestFocus(); widget.nextFocusNode!.requestFocus();
} }
}, },
obscureText: isPassword, obscureText: isPassword,
@ -123,11 +123,11 @@ class _InputFieldState extends State<InputField> {
), ),
if (widget.validationMessage != null) if (widget.validationMessage != null)
NoteText( NoteText(
widget.validationMessage, widget.validationMessage!,
color: Colors.red, color: Colors.red,
), ),
if (widget.additionalNote != null) verticalSpace(5), if (widget.additionalNote != null) verticalSpace(5),
if (widget.additionalNote != null) NoteText(widget.additionalNote), if (widget.additionalNote != null) NoteText(widget.additionalNote!),
verticalSpaceSmall verticalSpaceSmall
], ],
); );

View File

@ -3,9 +3,9 @@ import 'package:flutter/material.dart';
class NoteText extends StatelessWidget { class NoteText extends StatelessWidget {
final String text; final String text;
final TextAlign textAlign; final TextAlign? textAlign;
final Color color; final Color? color;
final double fontSize; final double? fontSize;
const NoteText(this.text, {this.textAlign, this.color, this.fontSize}); const NoteText(this.text, {this.textAlign, this.color, this.fontSize});
@override @override

View File

@ -3,13 +3,13 @@ import 'package:flutter/material.dart';
class TextLink extends StatelessWidget { class TextLink extends StatelessWidget {
final String text; final String text;
final Function onPressed; final Function? onPressed;
const TextLink(this.text, {this.onPressed}); const TextLink(this.text, {this.onPressed});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GestureDetector( return GestureDetector(
onTap: onPressed, onTap: () => onPressed,
child: Text( child: Text(
text, text,
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 14, color: textColor), style: TextStyle(fontWeight: FontWeight.w700, fontSize: 14, color: textColor),

View File

@ -7,35 +7,28 @@ packages:
name: archive name: archive
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.13" version: "3.1.9"
args:
dependency: transitive
description:
name: args
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.0"
async: async:
dependency: transitive dependency: transitive
description: description:
name: async name: async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.1" version: "2.8.2"
auto_size_text: auto_size_text:
dependency: "direct main" dependency: "direct main"
description: description:
name: auto_size_text name: auto_size_text
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "3.0.0"
barcode_scan: barcode_scan2:
dependency: "direct main" dependency: "direct main"
description: description:
name: barcode_scan name: barcode_scan2
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "4.2.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -49,7 +42,7 @@ packages:
name: characters name: characters
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.2.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
@ -63,7 +56,7 @@ packages:
name: charset_converter name: charset_converter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "2.0.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
@ -78,76 +71,62 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
convert:
dependency: transitive
description:
name: convert
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
name: crypto name: crypto
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.5" version: "3.0.1"
csslib: csslib:
dependency: transitive dependency: transitive
description: description:
name: csslib name: csslib
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.16.2" version: "0.17.1"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3" version: "1.0.4"
device_info: device_info:
dependency: "direct main" dependency: "direct main"
description: description:
name: device_info name: device_info
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "2.0.3"
device_info_platform_interface: device_info_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: device_info_platform_interface name: device_info_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "2.0.1"
equatable: equatable:
dependency: "direct main" dependency: "direct main"
description: description:
name: equatable name: equatable
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.6" version: "2.0.3"
esc_pos_bluetooth: esc_pos_bluetooth:
dependency: "direct main" dependency: "direct main"
description: description:
name: esc_pos_bluetooth name: esc_pos_bluetooth
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.8" version: "0.4.1"
esc_pos_utils: esc_pos_utils:
dependency: "direct main" dependency: "direct main"
description: description:
name: esc_pos_utils name: esc_pos_utils
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.6" version: "1.1.0"
esys_flutter_share:
dependency: "direct main"
description:
name: esys_flutter_share
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@ -175,7 +154,7 @@ packages:
name: fixnum name: fixnum
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.10.11" version: "1.0.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -187,35 +166,35 @@ packages:
name: flutter_bluetooth_basic name: flutter_bluetooth_basic
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.5" version: "0.1.7"
flutter_lock_screen: flutter_lock_screen:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_lock_screen name: flutter_lock_screen
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.8" version: "2.0.1"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.11" version: "2.0.5"
flutter_redux: flutter_redux:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_redux name: flutter_redux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.0" version: "0.8.2"
flutter_screenutil: flutter_screenutil:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_screenutil name: flutter_screenutil
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.1" version: "5.1.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -232,63 +211,63 @@ packages:
name: gbk_codec name: gbk_codec
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.2" version: "0.4.0"
get_it: get_it:
dependency: "direct main" dependency: "direct main"
description: description:
name: get_it name: get_it
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.0.6" version: "7.2.0"
google_fonts: google_fonts:
dependency: "direct main" dependency: "direct main"
description: description:
name: google_fonts name: google_fonts
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "2.2.0"
hex: hex:
dependency: transitive dependency: transitive
description: description:
name: hex name: hex
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.2" version: "0.2.0"
html: html:
dependency: transitive dependency: transitive
description: description:
name: html name: html
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.14.0+4" version: "0.15.0"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
name: http name: http
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.2" version: "0.13.4"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
name: http_parser name: http_parser
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.4" version: "4.0.0"
image: image:
dependency: transitive dependency: transitive
description: description:
name: image name: image
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.19" version: "3.1.1"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
name: intl name: intl
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.16.1" version: "0.17.0"
js: js:
dependency: transitive dependency: transitive
description: description:
@ -302,42 +281,42 @@ packages:
name: json_annotation name: json_annotation
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.1" version: "4.4.0"
local_auth: local_auth:
dependency: "direct main" dependency: "direct main"
description: description:
name: local_auth name: local_auth
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.3+4" version: "1.1.10"
logger: logger:
dependency: "direct main" dependency: "direct main"
description: description:
name: logger name: logger
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.9.4" version: "1.1.0"
mask_text_input_formatter: mask_text_input_formatter:
dependency: "direct main" dependency: "direct main"
description: description:
name: mask_text_input_formatter name: mask_text_input_formatter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.1" version: "2.1.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10" version: "0.12.11"
material_design_icons_flutter: material_design_icons_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: material_design_icons_flutter name: material_design_icons_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.5955" version: "5.0.6595"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@ -365,196 +344,217 @@ packages:
name: path_provider name: path_provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.28" version: "2.0.8"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+2" version: "2.1.5"
path_provider_macos: path_provider_macos:
dependency: transitive dependency: transitive
description: description:
name: path_provider_macos name: path_provider_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.4+8" version: "2.0.5"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "2.0.3"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.5" version: "2.0.5"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.1"
permission_handler: permission_handler:
dependency: "direct main" dependency: "direct main"
description: description:
name: permission_handler name: permission_handler
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.0+2" version: "8.3.0"
permission_handler_platform_interface: permission_handler_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_platform_interface name: permission_handler_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "3.7.0"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:
name: petitparser name: petitparser
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.0" version: "4.4.0"
platform: platform:
dependency: transitive dependency: transitive
description: description:
name: platform name: platform
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.2" version: "3.1.0"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "2.1.2"
process: process:
dependency: transitive dependency: transitive
description: description:
name: process name: process
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.3" version: "4.2.4"
protobuf: protobuf:
dependency: transitive dependency: transitive
description: description:
name: protobuf name: protobuf
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.4" version: "2.0.1"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
name: provider name: provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.3.3" version: "6.0.2"
qr: qr:
dependency: transitive dependency: transitive
description: description:
name: qr name: qr
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "2.1.0"
qr_flutter: qr_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: qr_flutter name: qr_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.2.0" version: "4.0.0"
redux: redux:
dependency: "direct main" dependency: "direct main"
description: description:
name: redux name: redux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0+3" version: "5.0.0"
redux_persist: redux_persist:
dependency: "direct main" dependency: "direct main"
description: description:
name: redux_persist name: redux_persist
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.4" version: "0.9.0"
redux_persist_flutter: redux_persist_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: redux_persist_flutter name: redux_persist_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.3" version: "0.9.0"
redux_thunk: redux_thunk:
dependency: "direct main" dependency: "direct main"
description: description:
name: redux_thunk name: redux_thunk
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.0" version: "0.4.0"
responsive_builder: responsive_builder:
dependency: "direct main" dependency: "direct main"
description: description:
name: responsive_builder name: responsive_builder
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.0" version: "0.4.1"
rxdart: rxdart:
dependency: transitive dependency: transitive
description: description:
name: rxdart name: rxdart
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.23.1" version: "0.26.0"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
name: shared_preferences name: shared_preferences
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.5.12+4" version: "2.0.12"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.10"
shared_preferences_ios:
dependency: transitive
description:
name: shared_preferences_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.9"
shared_preferences_linux: shared_preferences_linux:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_linux name: shared_preferences_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.2+4" version: "2.0.4"
shared_preferences_macos: shared_preferences_macos:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_macos name: shared_preferences_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+11" version: "2.0.2"
shared_preferences_platform_interface: shared_preferences_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_platform_interface name: shared_preferences_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "2.0.0"
shared_preferences_web: shared_preferences_web:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_web name: shared_preferences_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.2+7" version: "2.0.3"
shared_preferences_windows: shared_preferences_windows:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_windows name: shared_preferences_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.2+3" version: "2.0.4"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -573,14 +573,14 @@ packages:
name: sqflite name: sqflite
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.2+4" version: "2.0.2"
sqflite_common: sqflite_common:
dependency: transitive dependency: transitive
description: description:
name: sqflite_common name: sqflite_common
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3+3" version: "2.2.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -608,7 +608,7 @@ packages:
name: synchronized name: synchronized
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.0+2" version: "3.0.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
@ -622,7 +622,7 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.2" version: "0.4.3"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@ -636,70 +636,91 @@ packages:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.7.10" version: "6.0.18"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.14"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+4" version: "2.0.3"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+9" version: "2.0.3"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_platform_interface name: url_launcher_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.9" version: "2.0.5"
url_launcher_web: url_launcher_web:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.5+3" version: "2.0.6"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.1+3" version: "2.0.2"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
vocsy_esys_flutter_share:
dependency: "direct main"
description:
name: vocsy_esys_flutter_share
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
win32: win32:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.9" version: "2.3.8"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
name: xdg_directories name: xdg_directories
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.2" version: "0.2.0"
xml: xml:
dependency: transitive dependency: transitive
description: description:
name: xml name: xml
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.5.1" version: "5.3.1"
sdks: sdks:
dart: ">=2.13.0 <3.0.0" dart: ">=2.15.0 <3.0.0"
flutter: ">=1.22.2" flutter: ">=2.5.0"

View File

@ -2,42 +2,42 @@ name: aman_kassa_flutter
description: A new Flutter project. description: A new Flutter project.
version: 1.2.3+36 version: 1.2.3+36
environment: environment:
sdk: '>=2.3.0 <3.0.0' sdk: '>=2.15.0 <3.0.0'
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
cupertino_icons: ^0.1.3 cupertino_icons: ^1.0.4
redux: ^4.0.0+3 redux: ^5.0.0
flutter_redux: ^0.7.0 flutter_redux: ^0.8.2
redux_thunk: ^0.3.0 redux_thunk: ^0.4.0
redux_persist: ^0.8.4 redux_persist: ^0.9.0
redux_persist_flutter: ^0.8.3 redux_persist_flutter: ^0.9.0
responsive_builder: ^0.3.0 responsive_builder: ^0.4.1
provider: ^4.3.2+4 provider: ^6.0.2
logger: ^0.9.4 logger: ^1.1.0
get_it: ^5.0.4 get_it: ^7.2.0
equatable: ^1.2.5 equatable: ^2.0.3
http: ^0.12.2 http: ^0.13.4
sqflite: ^1.3.2+2 sqflite: ^2.0.2
path_provider: ^1.6.27 path_provider: ^2.0.8
google_fonts: ^1.1.1 google_fonts: ^2.2.0
material_design_icons_flutter: ^4.0.5855 material_design_icons_flutter: ^5.0.6595
intl: ^0.16.1 intl: ^0.17.0
barcode_scan: ^3.0.1 barcode_scan2: ^4.2.0
device_info: ^1.0.0 device_info: ^2.0.3
esys_flutter_share: ^1.0.2 vocsy_esys_flutter_share: ^1.0.0
auto_size_text: ^2.1.0 auto_size_text: ^3.0.0
url_launcher: ^5.7.10 url_launcher: ^6.0.18
qr_flutter: ^3.2.0 qr_flutter: ^4.0.0
mask_text_input_formatter: ^1.2.1 mask_text_input_formatter: ^2.1.0
flutter_screenutil: ^2.3.1 flutter_screenutil: ^5.1.0
shared_preferences: ^0.5.12+4 shared_preferences: ^2.0.12
flutter_lock_screen: ^1.0.8 flutter_lock_screen: ^2.0.1
local_auth: ^0.6.3+4 local_auth: ^1.1.10
esc_pos_bluetooth: ^0.2.8 esc_pos_bluetooth: ^0.4.1
esc_pos_utils: ^0.3.6 # no edit for esc_pos_bluetooth: ^0.2.8 esc_pos_utils: ^1.1.0 # no edit for esc_pos_bluetooth: ^0.2.8
charset_converter: ^1.0.3 charset_converter: ^2.0.0
permission_handler: ^5.0.1+2 permission_handler: ^8.3.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter