import 'dart:async'; import 'package:checker/screens/faq.dart'; import 'package:checker/screens/purchase.dart'; import 'package:checker/screens/registration.dart'; import 'package:checker/screens/settings.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; import 'db.dart'; import 'dart:convert'; import 'network.dart'; import 'resources.dart'; import 'strings.dart'; // Канал для взаимодействия с кодом платформы. const platform = const MethodChannel('com.dinect.checker/instance_id'); // Метод обеспечивает замену текущего объекта route новым. pushRouteReplacement(BuildContext context, Widget widget) { var route = new MaterialPageRoute(builder: (BuildContext context) => widget); new Future.delayed(const Duration(milliseconds: 200), () { Navigator.of(context).pushReplacement(route); }); } pushRoute(BuildContext context, Widget widget) { var route = new MaterialPageRoute(builder: (BuildContext context) => widget, fullscreenDialog: true); new Future.delayed(const Duration(milliseconds: 200), () { Navigator.of(context).push(route); }); } // Добавление route, с возможностью вернуться к предыдущему экрану. faq(SqliteHelper helper, String app, BuildContext context, bool returnToScanner) { pushRoute(context, new FAQScreen(helper, app, returnToScanner)); } // В методе отправляется запрос на удаление токена кассы, очищаются SharedPreferences приложения. logout(BuildContext context, SqliteHelper helper) async { String token = await helper.getToken(); VoidCallback positiveCallback = () { if (token != null) { getDeleteTokenRequest(token).then((response) { helper.clear().then((result) { platform.invokeMethod('getFlavor').then((flavor) { while (Navigator.of(context).canPop()) { Navigator.of(context).pop(); } pushRouteReplacement(context, new RegistrationScreen(helper, flavor)); }); }); }).catchError((error) { print(error.toString()); }); } else { while (Navigator.of(context).canPop()) { Navigator.of(context).pop(); } } }; showYesNoDialog(context, StringsLocalization.confirmation(), StringsLocalization.askChangeStore(), positiveCallback); } /// Запуск спецефичной для каждой платформы части приложения - сканера. /// Может производиться с нескольких экранов (splash, finish_registration). startScanner(BuildContext context, String app, SqliteHelper helper) async { String token = await helper.getToken(); // Канал ловит вызовы методов из "нативной" части приложения. // Могут быть вызваны либо exit либо faq, либо purchase. if (token != null) { platform.setMethodCallHandler((MethodCall call) async { if (call.method == 'findUser') { var userResponse; String cardPhone = call.arguments[0]; try { switch (call.arguments[1]) { case 'card': userResponse = await getUserByCard(cardPhone, token); break; case 'phone': userResponse = await getUserByPhone(cardPhone, token); break; } } catch (error) { print(error.toString()); } List users; try { users = JSON.decode(userResponse.body); } catch (error) { print(error); } if (users.length > 0) { return users[0]; } else { startScanner(context, app, helper); throw new FlutterError("Users not found"); } } else if (call.method == 'faq') { faq(helper, app, context, true); } else if (call.method == 'settings') { pushRoute(context, new SettingsScreen(helper, app, true)); } else { String userString; if (call.arguments[0] is String) { userString = call.arguments[0]; } else { userString = JSON.encode(call.arguments[0]); } print(userString); String card = call.arguments[1]; print('$userString, $card'); pushRouteReplacement(context, new PurchaseScreen(helper, app, userString, card)); } }); Map args = StringsLocalization.strings; args.addAll({ 'token': token, 'url': await platform.invokeMethod('getEndpoint'), 'appToken': await platform.invokeMethod('getAppToken'), 'localeCode': StringsLocalization.localeCode, 'color': Resources .getPrimaryColor(app) .value .toString() }); platform.invokeMethod('startScanner', args); } } // Запуск диалога с двумя кнопками showYesNoDialog(BuildContext context, String title, String content, VoidCallback positiveCallback) { showDialog( context: context, child: new AlertDialog( title: new Text(title), content: new Text(content), actions: [ new FlatButton( child: new Text(StringsLocalization.no()), onPressed: () { Navigator.of(context).pop(); }), new FlatButton( child: new Text(StringsLocalization.yes()), onPressed: positiveCallback) ])); } getCurrencyTitle(int code) { switch (code) { case 643: return StringsLocalization.nominativeRuble(); case 840: return StringsLocalization.nominativeDollar(); case 980: return StringsLocalization.nominativeHryvna(); case 978: return StringsLocalization.nominativeEuro(); case 398: return StringsLocalization.nominativeTenge(); } } getLocaleTitle(String code) { switch (code) { case 'ru': return 'Русский'; case 'en': return 'English'; case 'ua': return 'Український'; case 'es': return 'Español'; } } // Добавил вызов, что-бы AOT компилер не выкинул либу. getImage() async { return await ImagePicker.pickImage(); }