Локализация платформонезависимой части приложения

This commit is contained in:
Ivan Murashov
2017-09-04 18:57:30 +03:00
parent 3c494347dc
commit 6e8269b4df
19 changed files with 176 additions and 133 deletions

View File

@@ -2,13 +2,12 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'common.dart'; import 'common.dart';
import 'network.dart';
import 'consts.dart'; import 'consts.dart';
abstract class BaseState<T> extends State<T> { abstract class BaseState<T> extends State<StatefulWidget> {
bool loading = false; bool loading = false;
String error = null; String error;
String textFieldValue = ''; String textFieldValue = '';
TextEditingController controller = new TextEditingController(); TextEditingController controller = new TextEditingController();
@@ -22,7 +21,7 @@ abstract class BaseState<T> extends State<T> {
backgroundColor: primaryColor, actions: getMenuButtons(context)); backgroundColor: primaryColor, actions: getMenuButtons(context));
} }
@overide getMenuButtons(BuildContext context) { getMenuButtons(BuildContext context) {
return <Widget>[getFaqButton()]; return <Widget>[getFaqButton()];
} }
@@ -38,7 +37,7 @@ abstract class BaseState<T> extends State<T> {
return new Stack(children: <Widget>[getScreenContent(), getProgressIndicator()]); return new Stack(children: <Widget>[getScreenContent(), getProgressIndicator()]);
} }
Widget getScreenContent(BuildContext context); Widget getScreenContent();
String getTitle(); String getTitle();
@@ -80,7 +79,7 @@ abstract class BaseState<T> extends State<T> {
getDecoratedTextWidget() { getDecoratedTextWidget() {
return new Container(margin: new EdgeInsets.only(left: verticalMargin, right: verticalMargin), return new Container(margin: new EdgeInsets.only(left: verticalMargin, right: verticalMargin),
padding: getPaddingForTextWidget(), padding: getPaddingForTextWidget(),
decoration: getDecoraionForTextWidget(), decoration: getDecorationForTextWidget(),
child: getTextWidget()); child: getTextWidget());
} }
@@ -94,7 +93,7 @@ abstract class BaseState<T> extends State<T> {
} }
/// Метод возвращает BoxDecoration для _getDecoratedInputField /// Метод возвращает BoxDecoration для _getDecoratedInputField
getDecoraionForTextWidget() { getDecorationForTextWidget() {
return new BoxDecoration(color: getTextFilledBackground(), return new BoxDecoration(color: getTextFilledBackground(),
border: new Border.all(color: textBorderColor, width: 1.0), border: new Border.all(color: textBorderColor, width: 1.0),
borderRadius: new BorderRadius.all(new Radius.circular(4.0))); borderRadius: new BorderRadius.all(new Radius.circular(4.0)));
@@ -138,10 +137,10 @@ abstract class BaseState<T> extends State<T> {
return new Container(height: buttonHeight, child: new FlatButton(child: new Text(title, return new Container(height: buttonHeight, child: new FlatButton(child: new Text(title,
style: new TextStyle(color: textColor)), style: new TextStyle(color: textColor)),
onPressed: () => startScanner(context)), onPressed: () => startScanner(context)),
decoration: _getDecoraionForScanButton()); decoration: getDecorationForScanButton());
} }
_getDecoraionForScanButton() { getDecorationForScanButton() {
return new BoxDecoration( return new BoxDecoration(
border: new Border.all(color: primaryColor, width: 1.0), border: new Border.all(color: primaryColor, width: 1.0),
borderRadius: new BorderRadius.all(new Radius.circular(4.0))); borderRadius: new BorderRadius.all(new Radius.circular(4.0)));

View File

@@ -3,9 +3,10 @@ import 'package:flutter/material.dart';
import 'consts.dart'; import 'consts.dart';
import 'network.dart'; import 'network.dart';
import 'registration.dart'; import 'package:checker/registration/registration.dart';
import 'purchase.dart'; import 'package:checker/purchase/purchase.dart';
import 'faq.dart'; import 'faq.dart';
import 'strings.dart';
// Канал для взаимодействия с кодом платформы. // Канал для взаимодействия с кодом платформы.
const platform = const MethodChannel('com.dinect.checker/instance_id'); const platform = const MethodChannel('com.dinect.checker/instance_id');
@@ -46,7 +47,7 @@ logout(BuildContext context) {
} }
}; };
showYesNoDialog(context, 'Подтверждение', 'Вы действительно хотите выйти и ввести другой номер магазина?', positiveCalback); showYesNoDialog(context, Strings.of(context).confirmation(), Strings.of(context).askChangeStore(), positiveCalback);
} }
forceLogout(BuildContext context) { forceLogout(BuildContext context) {
@@ -100,12 +101,12 @@ showYesNoDialog(BuildContext context, String title, String content, VoidCallback
content: new Text(content), content: new Text(content),
actions: <Widget>[ actions: <Widget>[
new FlatButton( new FlatButton(
child: new Text('Нет'), child: new Text(Strings.of(context).no()),
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
), ),
new FlatButton( new FlatButton(
child: new Text('Да'), child: new Text(Strings.of(context).yes()),
onPressed: positiveCallback)])); onPressed: positiveCallback)]));
} }

View File

@@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
// Serious constants // Serious constants
const String appName = "Dinect"; const String appName = "Dinect";
const String url = 'https://pos-api-autoclub.dinect.com/20130701/'; const String url = 'https://pos-api-int.dinect.com/20130701/';
const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f'; const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08';
// Assets // Assets
const String logo_png = 'assets/registration_logo.png'; const String logo_png = 'assets/registration_logo.png';
@@ -29,6 +29,5 @@ const Color faqTitlesColor = const Color(0xff404040);
// Dimens // Dimens
const double verticalMargin = 28.0; const double verticalMargin = 28.0;
const double buttonVerticalMargin = 42.0;
const double buttonHeight = 48.0; const double buttonHeight = 48.0;
const double iconHeight = 20.0; const double iconHeight = 20.0;

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'base_state.dart'; import 'base_state.dart';
import 'consts.dart'; import 'consts.dart';
@@ -38,7 +37,7 @@ class EntryItem extends StatelessWidget {
class FAQScreen extends StatefulWidget { class FAQScreen extends StatefulWidget {
FAQScreen(this.b); FAQScreen(this.b);
bool b; final bool b;
@override State createState() => new FAQScreenState<FAQScreen>(b); @override State createState() => new FAQScreenState<FAQScreen>(b);
} }
@@ -46,16 +45,20 @@ class FAQScreen extends StatefulWidget {
class FAQScreenState<T> extends BaseState<FAQScreen> { class FAQScreenState<T> extends BaseState<FAQScreen> {
FAQScreenState(this.returnToScanner); FAQScreenState(this.returnToScanner);
bool returnToScanner; final bool returnToScanner;
@override String getTitle() { @override String getTitle() {
return "FAQ"; return "FAQ";
} }
@overide getMenuButtons(BuildContext context) { @override getMenuButtons(BuildContext context) {
return <Widget>[getLogoutButton()]; return <Widget>[getLogoutButton()];
} }
@override String getHint() {
return null;
}
/// Метод возвращает ListView с блоками faq. /// Метод возвращает ListView с блоками faq.
@override Widget getScreenContent() { @override Widget getScreenContent() {
return new WillPopScope(onWillPop: onWillPop, child: new ListView.builder( return new WillPopScope(onWillPop: onWillPop, child: new ListView.builder(

View File

@@ -8,10 +8,10 @@ import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart'; import 'package:intl/message_lookup_by_library.dart';
import 'package:intl/src/intl_helpers.dart'; import 'package:intl/src/intl_helpers.dart';
import 'stock_messages_messages_en.dart' as messages_messages_en; import 'messages_en.dart' as messages_messages_en;
import 'stock_messages_messages_es.dart' as messages_messages_es; import 'messages_es.dart' as messages_messages_es;
import 'stock_messages_messages_ru.dart' as messages_messages_ru; import 'messages_ru.dart' as messages_messages_ru;
import 'stock_messages_messages_ua.dart' as messages_messages_ua; import 'messages_ua.dart' as messages_messages_ua;
typedef Future<dynamic> LibraryLoader(); typedef Future<dynamic> LibraryLoader();
Map<String, LibraryLoader> _deferredLibraries = { Map<String, LibraryLoader> _deferredLibraries = {

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Сarrying out a purchase"), "carry_purchase" : MessageLookupByLibrary.simpleMessage("Сarrying out a purchase"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Complete registration"), "complite_activ" : MessageLookupByLibrary.simpleMessage("Complete registration"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Complete purchase"), "complite_purchase" : MessageLookupByLibrary.simpleMessage("Complete purchase"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("You confirm the purchase for N USD"), "confirm_purchase" : MessageLookupByLibrary.simpleMessage("You confirm the purchase for %s USD"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Сonfirmation"), "confirmation" : MessageLookupByLibrary.simpleMessage("Сonfirmation"),
"no" : MessageLookupByLibrary.simpleMessage("No"), "no" : MessageLookupByLibrary.simpleMessage("No"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("A purchase of N USD was complite"), "purchase_complite" : MessageLookupByLibrary.simpleMessage("A purchase of %s USD was complite"),
"registration" : MessageLookupByLibrary.simpleMessage("Registration"), "registration" : MessageLookupByLibrary.simpleMessage("Registration"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("The activation request for the application has been sent, wait for confirm activation"), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("The activation request for the application has been sent, wait for confirm activation"),
"reward" : MessageLookupByLibrary.simpleMessage("Reward"), "reward" : MessageLookupByLibrary.simpleMessage("Reward"),

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Realizar la compra"), "carry_purchase" : MessageLookupByLibrary.simpleMessage("Realizar la compra"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Terminar el registro"), "complite_activ" : MessageLookupByLibrary.simpleMessage("Terminar el registro"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Terminar la compra"), "complite_purchase" : MessageLookupByLibrary.simpleMessage("Terminar la compra"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("¿Confirmais la compra por N euros?"), "confirm_purchase" : MessageLookupByLibrary.simpleMessage("¿Confirmais la compra por %s euros?"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Confirmacón"), "confirmation" : MessageLookupByLibrary.simpleMessage("Confirmacón"),
"no" : MessageLookupByLibrary.simpleMessage("No"), "no" : MessageLookupByLibrary.simpleMessage("No"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("La compra por N euros está realizada"), "purchase_complite" : MessageLookupByLibrary.simpleMessage("La compra por %s euros está realizada"),
"registration" : MessageLookupByLibrary.simpleMessage("El registro"), "registration" : MessageLookupByLibrary.simpleMessage("El registro"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("El requieremento de activación de aplicación esta mandado, esperad la activación por el administrador."), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("El requieremento de activación de aplicación esta mandado, esperad la activación por el administrador."),
"reward" : MessageLookupByLibrary.simpleMessage("Gratificación"), "reward" : MessageLookupByLibrary.simpleMessage("Gratificación"),

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Проведение покупки"), "carry_purchase" : MessageLookupByLibrary.simpleMessage("Проведение покупки"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Завершить регистрацию"), "complite_activ" : MessageLookupByLibrary.simpleMessage("Завершить регистрацию"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Завершить покупку"), "complite_purchase" : MessageLookupByLibrary.simpleMessage("Завершить покупку"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("Вы подтверждаете покупку на N рублей"), "confirm_purchase" : MessageLookupByLibrary.simpleMessage("Вы подтверждаете покупку на %s рублей"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Подтверждение"), "confirmation" : MessageLookupByLibrary.simpleMessage("Подтверждение"),
"no" : MessageLookupByLibrary.simpleMessage("Нет"), "no" : MessageLookupByLibrary.simpleMessage("Нет"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("Покупка на сумму N рублей проведена"), "purchase_complite" : MessageLookupByLibrary.simpleMessage("Покупка на сумму %s рублей проведена"),
"registration" : MessageLookupByLibrary.simpleMessage("Регистрация"), "registration" : MessageLookupByLibrary.simpleMessage("Регистрация"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запрос на активацию приложения отправлен, дождитесь подтверждения активации администратором"), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запрос на активацию приложения отправлен, дождитесь подтверждения активации администратором"),
"reward" : MessageLookupByLibrary.simpleMessage("Вознаграждение"), "reward" : MessageLookupByLibrary.simpleMessage("Вознаграждение"),

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Проведення покупки"), "carry_purchase" : MessageLookupByLibrary.simpleMessage("Проведення покупки"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Завершити реєстрацію"), "complite_activ" : MessageLookupByLibrary.simpleMessage("Завершити реєстрацію"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Завершити купівлю"), "complite_purchase" : MessageLookupByLibrary.simpleMessage("Завершити купівлю"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("Ви підтверджуєте покупку на N гривень"), "confirm_purchase" : MessageLookupByLibrary.simpleMessage("Ви підтверджуєте покупку на %s гривень"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Підтвердження"), "confirmation" : MessageLookupByLibrary.simpleMessage("Підтвердження"),
"no" : MessageLookupByLibrary.simpleMessage("Ні"), "no" : MessageLookupByLibrary.simpleMessage("Ні"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("Купівля на суму N гривень проведена"), "purchase_complite" : MessageLookupByLibrary.simpleMessage("Купівля на суму %s гривень проведена"),
"registration" : MessageLookupByLibrary.simpleMessage("Реєстрація"), "registration" : MessageLookupByLibrary.simpleMessage("Реєстрація"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запит на активацію додатку відправлений, дочекайтеся підтвердження активації адміністратором"), "request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запит на активацію додатку відправлений, дочекайтеся підтвердження активації адміністратором"),
"reward" : MessageLookupByLibrary.simpleMessage("Винагорода"), "reward" : MessageLookupByLibrary.simpleMessage("Винагорода"),

View File

@@ -1,16 +1,16 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'splash.dart'; import 'splash.dart';
import 'consts.dart'; import 'consts.dart';
import 'stock_strings.dart'; import 'strings.dart';
import 'dart:async'; import 'dart:async';
import 'i18n/stock_messages_all.dart'; import 'i18n/messages_all.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
Future<LocaleQueryData> _onLocaleChanged(Locale locale) async { Future<LocaleQueryData> _onLocaleChanged(Locale locale) async {
final String localeString = locale.toString(); final String localeString = locale.toString();
await initializeMessages(localeString); await initializeMessages(localeString);
Intl.defaultLocale = localeString; Intl.defaultLocale = localeString;
return StockStrings.instance; return Strings.instance;
} }
/// Точка входа в приложение. /// Точка входа в приложение.

View File

@@ -1,5 +1,4 @@
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'dart:async';
import 'consts.dart'; import 'consts.dart';

View File

@@ -1,14 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'dart:convert'; import 'dart:convert';
import 'dart:async';
import 'dart:core'; import 'dart:core';
import 'main.dart'; import 'package:checker/strings.dart';
import 'common.dart'; import 'package:checker/common.dart';
import 'consts.dart'; import 'package:checker/consts.dart';
import 'network.dart'; import 'package:checker/network.dart';
import 'base_state.dart'; import 'package:checker/base_state.dart';
import 'purchase_success.dart'; import 'purchase_success.dart';
/// Экран проведения покупки. /// Экран проведения покупки.
@@ -16,8 +15,8 @@ class PurchaseScreen extends StatefulWidget {
PurchaseScreen(this.user, this.card); PurchaseScreen(this.user, this.card);
String user; final String user;
String card; final String card;
@override State createState() => new PurchaseScreenState<PurchaseScreen>(user, card); @override State createState() => new PurchaseScreenState<PurchaseScreen>(user, card);
} }
@@ -37,25 +36,39 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
@override Widget getScreenContent() { @override Widget getScreenContent() {
return new Column( return new Column(
children: <Widget>[new Expanded(child: new ListView(children: <Widget>[ children: <Widget>[new Expanded(child: new ListView(children: <Widget>[
getValueWithTitle('ФИО', user['first_name'] == null ? '' : user['first_name']), getValueWithTitle(Strings.of(context).userName(), user['first_name'] == null ? '' : user['first_name']),
getValueWithTitle('Карта', card), getValueWithTitle(Strings.of(context).card(), card),
getValueWithTitle('Вознаграждение', loyality), getValueWithTitle(Strings.of(context).reward(), loyality),
getHintLabel(), getHintLabel(),
getDecoratedTextWidget(), getDecoratedTextWidget(),
buildButton(new EdgeInsets.only(top: 36.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'ЗАВЕРШИТЬ ПОКУПКУ', () => onPurchaseClick(context))), buildButton(getScreenMargins(36.0), getCompleteButton()),
buildButton(new EdgeInsets.only(top: 24.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildFlatButton(context, 'СКАНИРОВАТЬ', primaryColor)) buildButton(getScreenMargins(24.0), getScanButton())
]))]); ]))]);
} }
getScreenMargins(double top) {
double side = 42.0;
return new EdgeInsets.only(top: top, left: side, right: side);
}
getCompleteButton() {
String title = Strings.of(context).completePurchase();
return buildRaisedButton(context, title, () => onPurchaseClick(context));
}
getScanButton() {
return buildFlatButton(context, Strings.of(context).scan(), primaryColor);
}
@override String getTitle() { @override String getTitle() {
return "Проведение покупки"; return Strings.of(context).carryingPurchase();
} }
@override getHint() { @override getHint() {
return 'Сумма'; return Strings.of(context).sum();
} }
@overide getMenuButtons(BuildContext context) { @override getMenuButtons(BuildContext context) {
return <Widget>[getFaqButton(), getLogoutButton()]; return <Widget>[getFaqButton(), getLogoutButton()];
} }
@@ -130,7 +143,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
try { try {
sumTotal = num.parse(text); sumTotal = num.parse(text);
} catch(exception, stacktrace) { } catch(exception) {
print(exception); print(exception);
try { try {
int idx = text.indexOf('.'); int idx = text.indexOf('.');
@@ -140,7 +153,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
fractionalPart = fractionalPart.substring(0, 2); fractionalPart = fractionalPart.substring(0, 2);
} }
return '${integerPart}.${fractionalPart}'; return '${integerPart}.${fractionalPart}';
} catch(exception, stacktrace){ } catch(exception){
print(exception); print(exception);
} }
} }
@@ -150,17 +163,17 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
onPurchaseClick(BuildContext context) { onPurchaseClick(BuildContext context) {
String val = _parseSum(controller.text); String val = _parseSum(controller.text);
showDialog(context: context, child: new AlertDialog( showDialog(context: context, child: new AlertDialog(
title: new Text('Подтверждение'), title: new Text(Strings.of(context).confirmation()),
content: new Text('Вы подтверждаете покупку на ${val} руб?'), content: new Text(getContentMessage(val)),
actions: <Widget>[ actions: <Widget>[
new FlatButton( new FlatButton(
child: new Text('Нет'), child: new Text(Strings.of(context).no()),
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
new FlatButton( new FlatButton(
child: new Text('Да'), child: new Text(Strings.of(context).yes()),
onPressed: () { onPressed: () {
purchase(val); purchase(val);
}, },
@@ -168,7 +181,11 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
])); ]));
} }
purchase(String sum_total) async { getContentMessage(String val) {
return Strings.of(context).confirmPurchase(val);
}
purchase(String sumTotal) async {
if (await platform.invokeMethod('isOnline')) { if (await platform.invokeMethod('isOnline')) {
@@ -180,7 +197,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
'doc_id': result, 'doc_id': result,
'curr_iso_code': '643', 'curr_iso_code': '643',
'commit': 'true', 'commit': 'true',
'sum_total': sum_total 'sum_total': sumTotal
}; };
var headers = { var headers = {
@@ -192,7 +209,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
print(response.body); print(response.body);
Navigator.of(context).pop(); Navigator.of(context).pop();
pushRoute(context, new PurchaseSuccessScreen(sum_total, user['first_name'] == null ? '' : user['first_name'])); pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name']));
}).catchError((error) { }).catchError((error) {
print(error.toString()); print(error.toString());

View File

@@ -1,18 +1,16 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'main.dart'; import 'package:checker/common.dart';
import 'common.dart'; import 'package:checker/consts.dart';
import 'consts.dart'; import 'package:checker/strings.dart';
import 'base_state.dart'; import 'package:checker/base_state.dart';
import 'purchase.dart';
/// Экран проведения покупки. /// Экран проведения покупки.
class PurchaseSuccessScreen extends StatefulWidget { class PurchaseSuccessScreen extends StatefulWidget {
PurchaseSuccessScreen(this.val, this.name); PurchaseSuccessScreen(this.val, this.name);
String val; final String val;
String name; final String name;
@override State createState() => new PurchaseSuccessScreenState(val, name); @override State createState() => new PurchaseSuccessScreenState(val, name);
} }
@@ -24,28 +22,46 @@ class PurchaseSuccessScreenState<T> extends BaseState<PurchaseSuccessScreen> {
String sum; String sum;
String username; String username;
@overide getMenuButtons(BuildContext context) { @override getMenuButtons(BuildContext context) {
return <Widget>[getFaqButton(), getLogoutButton()]; return <Widget>[getFaqButton(), getLogoutButton()];
} }
@override String getTitle() { @override String getTitle() {
return "Проведение покупки"; return Strings.of(context).carryingPurchase();
}
@override String getHint() {
return null;
} }
@override Widget getScreenContent() { @override Widget getScreenContent() {
return new Column(children: <Widget>[ return new Column(children: <Widget>[
getValueWithTitle('Покупатель', username), getValueWithTitle(Strings.of(context).buyer(), username),
getSuccessMessage(), getSuccessMessage(),
new Expanded(child: new Center()), new Expanded(child: new Center()),
buildButton(new EdgeInsets.only(bottom: 74.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'СКАНИРОВАТЬ', () => startScanner(context))) buildButton(getScreenMargins(74.0), getScanButton())
]); ]);
} }
getScreenMargins(double bottom) {
double side = 42.0;
return new EdgeInsets.only(bottom: bottom, left: side, right: side);
}
getScanButton() {
String title = Strings.of(context).scan();
return buildRaisedButton(context, title, () => startScanner(context));
}
getSuccessMessage() { getSuccessMessage() {
return new Row(children: <Widget>[new Expanded(child: new Container(margin: new EdgeInsets.only(top: 20.0), height: 64.0, return new Row(children: <Widget>[new Expanded(child: new Container(margin: new EdgeInsets.only(top: 20.0), height: 64.0,
decoration: new BoxDecoration(color: greenBackground), decoration: new BoxDecoration(color: greenBackground),
child: new Center(child: new Text('Покупка на сумму ${sum} руб. проведена', textAlign: TextAlign.center, child: new Center(child: new Text(getMessageTitle(), textAlign: TextAlign.center,
style: new TextStyle(fontWeight: FontWeight.bold, color: tokenActiveTextColor)))))]); style: new TextStyle(fontWeight: FontWeight.bold, color: tokenActiveTextColor)))))]);
} }
getMessageTitle() {
return Strings.of(context).purchaseCompleted(sum);
}
} }

View File

@@ -1,11 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'common.dart';
import 'consts.dart';
import 'network.dart';
import 'dart:convert'; // Пакет для обработки json с ответом от сервера. import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
import 'base_state.dart';
import 'package:checker/common.dart';
import 'package:checker/consts.dart';
import 'package:checker/network.dart';
import 'package:checker/base_state.dart';
import 'package:checker/strings.dart';
class FinishRegistrationScreen extends StatefulWidget { class FinishRegistrationScreen extends StatefulWidget {
@override State createState() => new _RegistrationScreenState(); @override State createState() => new _RegistrationScreenState();
@@ -23,11 +24,11 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
} }
@override String getTitle() { @override String getTitle() {
return "Регистрация"; return Strings.of(context).registration();
} }
@override getHint() { @override getHint() {
return 'ID магазина'; return Strings.of(context).idStore();
} }
@override Widget getScreenContent() { @override Widget getScreenContent() {
@@ -36,7 +37,9 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
getHintLabel(), getHintLabel(),
getDecoratedTextWidget(), getDecoratedTextWidget(),
getMessage(), getMessage(),
buildRaisedButton(context, _tokenActive ? 'ЗАВЕРШИТЬ РЕГИСТРАЦИЮ' : 'ОБНОВИТЬ СТАТУС АКТИВАЦИИ', () => handleTap()) buildRaisedButton(context, _tokenActive
? Strings.of(context).completeRegistration()
: Strings.of(context).refreshActivationStatus(), () => handleTap())
]); ]);
} }
@@ -96,7 +99,9 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
/// Получаем текст сообщения, в зависимости от статуса активации. /// Получаем текст сообщения, в зависимости от статуса активации.
getMessageString() { getMessageString() {
return _tokenActive ? tokenActiveMessage : tokenWaitMessage; return _tokenActive
? Strings.of(context).completeRegistration()
: Strings.of(context).refreshActivationStatus();
} }
/// Фоновое изображение для сообщения. /// Фоновое изображение для сообщения.

View File

@@ -1,12 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:convert'; // Пакет для обработки json с ответом от сервера. import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
import 'common.dart'; import 'package:checker/common.dart';
import 'network.dart'; import 'package:checker/network.dart';
import 'consts.dart'; import 'package:checker/base_state.dart';
import 'package:checker/strings.dart';
import 'activate_token.dart'; import 'activate_token.dart';
import 'base_state.dart';
import 'stock_strings.dart';
/// Экран регистрации магазина и кассы. /// Экран регистрации магазина и кассы.
class RegistrationScreen extends StatefulWidget { class RegistrationScreen extends StatefulWidget {
@@ -16,11 +15,11 @@ class RegistrationScreen extends StatefulWidget {
class _RegistrationScreenState extends BaseState<RegistrationScreen> { class _RegistrationScreenState extends BaseState<RegistrationScreen> {
@override String getTitle() { @override String getTitle() {
return StockStrings.of(context).registration(); return Strings.of(context).registration();
} }
@override getHint() { @override getHint() {
return 'ID магазина'; return Strings.of(context).idStore();
} }
// Список виджетов, автоматически прокручиваемый вверх при открытии клавиатуры. // Список виджетов, автоматически прокручиваемый вверх при открытии клавиатуры.
@@ -38,7 +37,7 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
// Возвращает кнопку регистрации. // Возвращает кнопку регистрации.
getButton() { getButton() {
return new Container(margin: new EdgeInsets.only(top: 36.0), child: return new Container(margin: new EdgeInsets.only(top: 36.0), child:
buildRaisedButton(context, 'ЗАРЕГИСТРИРОВАТЬ', getOnPressed())); buildRaisedButton(context, Strings.of(context).signUp(), getOnPressed()));
} }
// Возвращает обработчик нажатий на кнопку регистрации. // Возвращает обработчик нажатий на кнопку регистрации.

View File

@@ -5,8 +5,8 @@ import 'dart:convert';
import 'common.dart'; import 'common.dart';
import 'network.dart'; import 'network.dart';
import 'consts.dart'; import 'consts.dart';
import 'registration.dart'; import 'package:checker/registration/registration.dart';
import 'activate_token.dart'; import 'package:checker/registration/activate_token.dart';
class SplashScreen extends StatelessWidget { class SplashScreen extends StatelessWidget {

View File

@@ -1,39 +0,0 @@
import 'package:intl/intl.dart';
import 'package:flutter/widgets.dart';
import 'dart:async';
class StockStrings extends LocaleQueryData {
static StockStrings of(BuildContext context) {
return LocaleQuery.of(context);
}
static final StockStrings instance = new StockStrings();
String ID_Store() => Intl.message('ID_Store');
String sign_up() => Intl.message('sign_up');
String registration() => Intl.message('registration');
String specify_din_store() => Intl.message('specify_din_store');
String confirmation() => Intl.message('confirmation');
String ask_change_store() => Intl.message('ask_change_store');
String yes() => Intl.message('yes');
String no() => Intl.message('no');
String request_sent_wait_activ() => Intl.message('request_sent_wait_activ');
String update_activ_status() => Intl.message('update_activ_status');
String app_activ() => Intl.message('app_activ');
String complite_activ() => Intl.message('complite_activ');
String card_scaner() => Intl.message('card_scaner');
String user_name() => Intl.message('user_name');
String card() => Intl.message('card');
String reward() => Intl.message('reward');
String sum() => Intl.message('sum');
String carry_purchase() => Intl.message('carry_purchase');
String complite_purchase() => Intl.message('complite_purchase');
String scan() => Intl.message('scan');
String confirm_purchase() => Intl.message('confirm_purchase');
String buyer() => Intl.message('buyer');
String purchase_complite() => Intl.message('purchase_complite');
String ID_not_found() => Intl.message('ID_not_found');
}

43
lib/strings.dart Normal file
View File

@@ -0,0 +1,43 @@
import 'package:intl/intl.dart';
import 'package:flutter/widgets.dart';
import 'package:sprintf/sprintf.dart';
class Strings extends LocaleQueryData {
static Strings of(BuildContext context) {
return LocaleQuery.of(context);
}
static final Strings instance = new Strings();
String confirmPurchase(String val) {
return sprintf(Intl.message('confirm_purchase'), val);
}
String purchaseCompleted(String val) {
return sprintf(Intl.message('purchase_complite'), val);
}
String idStore() => Intl.message('ID_Store');
String signUp() => Intl.message('sign_up');
String registration() => Intl.message('registration');
String specifyDinStore() => Intl.message('specify_din_store');
String confirmation() => Intl.message('confirmation');
String askChangeStore() => Intl.message('ask_change_store');
String yes() => Intl.message('yes');
String no() => Intl.message('no');
String requestSentWaitActivation() => Intl.message('request_sent_wait_activ');
String refreshActivationStatus() => Intl.message('update_activ_status');
String appActivated() => Intl.message('app_activ');
String completeRegistration() => Intl.message('complite_activ');
String cardScanner() => Intl.message('card_scaner');
String userName() => Intl.message('user_name');
String card() => Intl.message('card');
String reward() => Intl.message('reward');
String sum() => Intl.message('sum');
String carryingPurchase() => Intl.message('carry_purchase');
String completePurchase() => Intl.message('complite_purchase');
String scan() => Intl.message('scan');
String buyer() => Intl.message('buyer');
String idNotFound() => Intl.message('ID_not_found');
}

View File

@@ -5,6 +5,7 @@ dependencies:
http: '>=0.11.3+12' http: '>=0.11.3+12'
intl: '>=0.14.0 <0.16.0' intl: '>=0.14.0 <0.16.0'
intl_translation: '>=0.14.0 <0.16.0' intl_translation: '>=0.14.0 <0.16.0'
sprintf: "^3.0.2"
flutter: flutter:
sdk: flutter sdk: flutter