Экран переключения валюты открывается с первого раза, соединение с базой данных не открывается на тех экранах, на которых это не требуется
This commit is contained in:
13
lib/base/base_screen.dart
Normal file
13
lib/base/base_screen.dart
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import 'package:checker/db.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
abstract class BaseScreen extends StatefulWidget {
|
||||||
|
|
||||||
|
final SqliteHelper helper;
|
||||||
|
final String app;
|
||||||
|
|
||||||
|
BaseScreen(this.helper, this.app);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState();
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:checker/screens/faq.dart';
|
import 'package:checker/screens/faq.dart';
|
||||||
import 'package:checker/screens/purchase.dart';
|
import 'package:checker/screens/purchase.dart';
|
||||||
import 'package:checker/screens/registration.dart';
|
import 'package:checker/screens/registration.dart';
|
||||||
|
import 'package:checker/screens/splash.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
@@ -43,7 +44,7 @@ logout(BuildContext context) async {
|
|||||||
platform.invokeMethod('removeKeys').then((result) {
|
platform.invokeMethod('removeKeys').then((result) {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию
|
pushRouteReplacement(context, new SplashScreen()); // Запускаем регистрацию
|
||||||
});
|
});
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
print(error.toString());
|
print(error.toString());
|
||||||
@@ -66,7 +67,7 @@ forceLogout(String token , BuildContext context) async {
|
|||||||
helper.clear().then((_) {
|
helper.clear().then((_) {
|
||||||
helper.close().then((_) {
|
helper.close().then((_) {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию
|
pushRouteReplacement(context, new SplashScreen());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,25 +1,16 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:checker/screens/splash.dart';
|
import 'package:checker/screens/splash.dart';
|
||||||
import 'consts.dart';
|
import 'consts.dart';
|
||||||
import 'strings.dart';
|
|
||||||
import 'common.dart';
|
|
||||||
import 'dart:async';
|
|
||||||
|
|
||||||
/// Точка входа в приложение.
|
/// Точка входа в приложение.
|
||||||
void main() {
|
void main() {
|
||||||
runApp(new Checker());
|
runApp(new Checker());
|
||||||
}
|
}
|
||||||
|
|
||||||
class Checker extends StatefulWidget {
|
class Checker extends StatelessWidget {
|
||||||
@override CheckerState createState() => new CheckerState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class CheckerState extends State<Checker> {
|
|
||||||
|
|
||||||
@override Widget build(BuildContext context) {
|
@override Widget build(BuildContext context) {
|
||||||
return new MaterialApp(
|
return new MaterialApp(
|
||||||
title: appName,
|
title: appName,
|
||||||
home: new SplashScreen());
|
home: new SplashScreen());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:checker/base/base_screen.dart';
|
||||||
import 'package:checker/base/settings_base_state.dart';
|
import 'package:checker/base/settings_base_state.dart';
|
||||||
import 'package:checker/db.dart';
|
import 'package:checker/db.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:checker/strings.dart';
|
import 'package:checker/strings.dart';
|
||||||
import 'package:checker/common.dart';
|
|
||||||
|
|
||||||
class CurrenciesScreen extends StatefulWidget {
|
class CurrenciesScreen extends BaseScreen {
|
||||||
|
|
||||||
final SqliteHelper helper;
|
CurrenciesScreen(helper, app) : super(helper, app);
|
||||||
final String app;
|
|
||||||
|
|
||||||
CurrenciesScreen(this.helper, this.app);
|
|
||||||
|
|
||||||
@override State createState() => new _CurrenciesState(helper, app);
|
@override State createState() => new _CurrenciesState(helper, app);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -219,10 +219,17 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
|
|||||||
httpClient.post(url, body: body, headers: headers).then((response) {
|
httpClient.post(url, body: body, headers: headers).then((response) {
|
||||||
|
|
||||||
print(response.body);
|
print(response.body);
|
||||||
helper.close().then((_) {
|
Map parsedMap = JSON.decode(response.body);
|
||||||
Navigator.of(context).pop();
|
|
||||||
pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name']));
|
if (parsedMap.containsKey('errors')) {
|
||||||
});
|
List<String> errors = parsedMap['errors'];
|
||||||
|
// TODO: ПОказывать сообщение с ошибкой!
|
||||||
|
} else {
|
||||||
|
helper.close().then((_) {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name']));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
purchaseInProgress = false;
|
purchaseInProgress = false;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:checker/base/base_screen.dart';
|
||||||
import 'package:checker/screens/finish_registration.dart';
|
import 'package:checker/screens/finish_registration.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
|
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
|
||||||
@@ -9,7 +10,10 @@ import 'package:checker/base/base_state.dart';
|
|||||||
import 'package:checker/strings.dart';
|
import 'package:checker/strings.dart';
|
||||||
|
|
||||||
/// Экран регистрации магазина и кассы.
|
/// Экран регистрации магазина и кассы.
|
||||||
class RegistrationScreen extends StatefulWidget {
|
class RegistrationScreen extends BaseScreen {
|
||||||
|
|
||||||
|
RegistrationScreen(helper, app) : super(helper, app);
|
||||||
|
|
||||||
@override State createState() => new _RegistrationScreenState();
|
@override State createState() => new _RegistrationScreenState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
import 'package:checker/db.dart';
|
import 'package:checker/base/base_screen.dart';
|
||||||
import 'package:checker/screens/currencies.dart';
|
import 'package:checker/base/base_state.dart';
|
||||||
import 'package:checker/screens/languages.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:checker/common.dart';
|
import 'package:checker/common.dart';
|
||||||
import 'package:checker/consts.dart';
|
import 'package:checker/consts.dart';
|
||||||
|
import 'package:checker/db.dart';
|
||||||
|
import 'package:checker/screens/currencies.dart';
|
||||||
import 'package:checker/strings.dart';
|
import 'package:checker/strings.dart';
|
||||||
import 'package:checker/base/base_state.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class SettingsScreen extends StatefulWidget {
|
class SettingsScreen extends BaseScreen {
|
||||||
|
|
||||||
final SqliteHelper helper;
|
SettingsScreen(helper, app) : super(helper, app);
|
||||||
final String app;
|
|
||||||
|
|
||||||
SettingsScreen(this.helper, this.app);
|
|
||||||
|
|
||||||
@override State createState() => new SettingsState(helper, app);
|
@override State createState() => new SettingsState(helper, app);
|
||||||
}
|
}
|
||||||
@@ -27,7 +24,7 @@ class MenuItem {
|
|||||||
|
|
||||||
class SettingsState extends BaseState<SettingsScreen> {
|
class SettingsState extends BaseState<SettingsScreen> {
|
||||||
|
|
||||||
List<MenuItem> menuItems;
|
List<MenuItem> menuItems = [new MenuItem(StringsLocalization.currency(), '')];
|
||||||
|
|
||||||
SettingsState(SqliteHelper helper, String app) {
|
SettingsState(SqliteHelper helper, String app) {
|
||||||
this.helper = helper;
|
this.helper = helper;
|
||||||
@@ -35,15 +32,15 @@ class SettingsState extends BaseState<SettingsScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override Widget build(BuildContext ctx) {
|
@override Widget build(BuildContext ctx) {
|
||||||
helper.getSettings().then((info) {
|
helper.getSettings().then((info) {
|
||||||
setState(() {
|
if (menuItems != null) {
|
||||||
print("load settings");
|
if (menuItems[0].selectedValue != info['currency'].toString()) {
|
||||||
menuItems = [
|
setState(() {
|
||||||
// new MenuItem(StringsLocalization.locale(), getLocaleTitle(info["locale"])),
|
menuItems[0].selectedValue = info['currency'].toString();
|
||||||
new MenuItem(StringsLocalization.currency(), getCurrencyTitle(info["currency"]))
|
});
|
||||||
];
|
}
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
return getMainWidget();
|
return getMainWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,16 +70,21 @@ class SettingsState extends BaseState<SettingsScreen> {
|
|||||||
return new Container(
|
return new Container(
|
||||||
height: 56.0,
|
height: 56.0,
|
||||||
padding: new EdgeInsets.only(left: 8.0),
|
padding: new EdgeInsets.only(left: 8.0),
|
||||||
child: (new FlatButton(onPressed: () => onPressed(menuItems.indexOf(item)),
|
child: (new FlatButton(
|
||||||
|
onPressed: () => onPressed(menuItems.indexOf(item)),
|
||||||
child: new Row(children: <Widget>[
|
child: new Row(children: <Widget>[
|
||||||
new Expanded(child: new Text(item.title, style: new TextStyle(fontWeight: FontWeight.w600, color: faqGrey, fontSize: 14.0))),
|
new Expanded(child: new Text(item.title, style: new TextStyle(
|
||||||
new Text(item.selectedValue, style: new TextStyle(fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)),
|
fontWeight: FontWeight.w600,
|
||||||
getArrow()]))));
|
color: faqGrey,
|
||||||
|
fontSize: 14.0))),
|
||||||
|
new Text(getCurrencyTitle(int.parse(item.selectedValue)), style: new TextStyle(
|
||||||
|
fontWeight: FontWeight.w400, color: faqGrey, fontSize: 14.0)),
|
||||||
|
getArrow()
|
||||||
|
]))));
|
||||||
}
|
}
|
||||||
|
|
||||||
void onPressed(int position) {
|
void onPressed(int position) {
|
||||||
switch (position) {
|
switch (position) {
|
||||||
// case 0 : return pushRoute(context, new LanguagesScreen());
|
|
||||||
case 0 : return pushRoute(context, new CurrenciesScreen(helper, app));
|
case 0 : return pushRoute(context, new CurrenciesScreen(helper, app));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:checker/base/base_state.dart';
|
||||||
|
import 'package:checker/common.dart';
|
||||||
|
import 'package:checker/consts.dart';
|
||||||
|
import 'package:checker/db.dart';
|
||||||
|
import 'package:checker/network.dart';
|
||||||
|
import 'package:checker/resources.dart';
|
||||||
|
import 'package:checker/screens/finish_registration.dart';
|
||||||
|
import 'package:checker/screens/registration.dart';
|
||||||
import 'package:checker/strings.dart';
|
import 'package:checker/strings.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'dart:convert';
|
|
||||||
import 'dart:async';
|
|
||||||
import 'package:checker/common.dart';
|
|
||||||
import 'package:checker/network.dart';
|
|
||||||
import 'package:checker/consts.dart';
|
|
||||||
import 'package:checker/resources.dart';
|
|
||||||
import 'package:checker/db.dart';
|
|
||||||
import 'package:checker/base/base_state.dart';
|
|
||||||
import 'package:checker/screens/registration.dart';
|
|
||||||
import 'package:checker/screens/finish_registration.dart';
|
|
||||||
|
|
||||||
class SplashScreen extends StatefulWidget {
|
class SplashScreen extends StatefulWidget {
|
||||||
@override State createState() => new _SplashScreenState();
|
@override State createState() => new _SplashScreenState();
|
||||||
@@ -26,10 +27,9 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
@override void onStart() {
|
@override void onStart() {
|
||||||
helper.getSettings().then((info) {
|
helper.getSettings().then((info) {
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
platform.invokeMethod('getLocale').then((locale) {
|
platform.invokeMethod('getCurrency').then((currency) {
|
||||||
Intl.defaultLocale = locale;
|
platform.invokeMethod('getLocale').then((locale) {
|
||||||
StringsLocalization.load(locale).then((l) {
|
initLocale(locale, () {
|
||||||
platform.invokeMethod('getCurrency').then((currency) {
|
|
||||||
helper.createAppInfo(locale, currency).then((_) {
|
helper.createAppInfo(locale, currency).then((_) {
|
||||||
showNext();
|
showNext();
|
||||||
});
|
});
|
||||||
@@ -38,8 +38,7 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
helper.getLocale().then((locale) {
|
helper.getLocale().then((locale) {
|
||||||
Intl.defaultLocale = locale;
|
initLocale(locale, () {
|
||||||
StringsLocalization.load(locale).then((l) {
|
|
||||||
showNext();
|
showNext();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -47,6 +46,13 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void initLocale<T>(String locale, Future<T> onValue()) {
|
||||||
|
Intl.defaultLocale = locale;
|
||||||
|
StringsLocalization.load(locale).then((_) {
|
||||||
|
onValue();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void showNext() {
|
void showNext() {
|
||||||
new Future.delayed(const Duration(milliseconds: 1000), () {
|
new Future.delayed(const Duration(milliseconds: 1000), () {
|
||||||
showNextScreen();
|
showNextScreen();
|
||||||
@@ -69,7 +75,8 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
bottom: 5.0),
|
bottom: 5.0),
|
||||||
child: new Image.asset(powered_by_dinect_splash_png,
|
child: new Image.asset(powered_by_dinect_splash_png,
|
||||||
height: 16.0,
|
height: 16.0,
|
||||||
width: 122.0)))]);
|
width: 122.0)))
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Возвращает столбец с логотипом приложения и текстом под ним.
|
/// Возвращает столбец с логотипом приложения и текстом под ним.
|
||||||
@@ -86,19 +93,18 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
new Image.asset(
|
new Image.asset(
|
||||||
splash_text_png,
|
splash_text_png,
|
||||||
height: 40.0,
|
height: 40.0,
|
||||||
width: 240.0)]));
|
width: 240.0)
|
||||||
|
]));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Запуск следующего экрана приложения.
|
/// Запуск следующего экрана приложения.
|
||||||
showNextScreen() async {
|
showNextScreen() async {
|
||||||
|
|
||||||
String token = await helper.getToken();
|
String token = await helper.getToken();
|
||||||
|
|
||||||
// В случае, если в приложении отсутствует токен,
|
// В случае, если в приложении отсутствует токен,
|
||||||
// необходимо запустить регистрацию кассы.
|
// необходимо запустить регистрацию кассы.
|
||||||
if (token == null) {
|
if (token == null) {
|
||||||
await helper.close();
|
pushRouteReplacement(context, new RegistrationScreen(helper, app));
|
||||||
pushRouteReplacement(context, new RegistrationScreen());
|
|
||||||
} else {
|
} else {
|
||||||
if (await platform.invokeMethod('isOnline')) {
|
if (await platform.invokeMethod('isOnline')) {
|
||||||
checkTokenStatus(token).then((statusResponse) {
|
checkTokenStatus(token).then((statusResponse) {
|
||||||
@@ -122,12 +128,9 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
|
|
||||||
if (code == 404) {
|
if (code == 404) {
|
||||||
helper.clear().then((result) {
|
helper.clear().then((result) {
|
||||||
helper.close().then((_) {
|
pushRouteReplacement(context, new RegistrationScreen(helper, app));
|
||||||
pushRouteReplacement(context, new RegistrationScreen());
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
Map status = JSON.decode(statusResponse.body);
|
Map status = JSON.decode(statusResponse.body);
|
||||||
bool active = status['active'] == null ? false : status['active'];
|
bool active = status['active'] == null ? false : status['active'];
|
||||||
|
|
||||||
@@ -149,7 +152,6 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
/// Если вернулся код 200, значит токен был ранее удален и только что снова создался.
|
/// Если вернулся код 200, значит токен был ранее удален и только что снова создался.
|
||||||
/// Нужно удалить его и направить пользователя на экран регистрации.
|
/// Нужно удалить его и направить пользователя на экран регистрации.
|
||||||
_createToken(SqliteHelper helper) async {
|
_createToken(SqliteHelper helper) async {
|
||||||
|
|
||||||
String merchantID = await helper.getMerchantID();
|
String merchantID = await helper.getMerchantID();
|
||||||
String posID = await helper.getPosID();
|
String posID = await helper.getPosID();
|
||||||
|
|
||||||
@@ -165,13 +167,11 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
|||||||
|
|
||||||
/// Очищаем бд, делаем запрос на удаление токена.
|
/// Очищаем бд, делаем запрос на удаление токена.
|
||||||
void clearToken(Response response, SqliteHelper helper) {
|
void clearToken(Response response, SqliteHelper helper) {
|
||||||
|
|
||||||
helper.clear().then((_) {
|
helper.clear().then((_) {
|
||||||
Map parsedMap = JSON.decode(response.body);
|
Map parsedMap = JSON.decode(response.body);
|
||||||
deleteToken(parsedMap['token']).then((_) {
|
deleteToken(parsedMap['token']).then((_) {
|
||||||
helper.close();
|
Navigator.of(context).pop();
|
||||||
Navigator.of(context).pop(); // Убираем текущий route
|
pushRouteReplacement(context, new RegistrationScreen(helper, app));
|
||||||
pushRouteReplacement(context, new RegistrationScreen()); // Запускаем регистрацию
|
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
helper.close();
|
helper.close();
|
||||||
print(error.toString());
|
print(error.toString());
|
||||||
|
|||||||
Reference in New Issue
Block a user