Экран переключения валюты открывается с первого раза, соединение с базой данных не открывается на тех экранах, на которых это не требуется

This commit is contained in:
kifio
2017-09-12 00:08:13 +03:00
parent 9e4cbe200d
commit e8788f72a3
8 changed files with 98 additions and 81 deletions

13
lib/base/base_screen.dart Normal file
View 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();
}

View File

@@ -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());
}); });
}); });
}); });

View File

@@ -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());
} }
} }

View File

@@ -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);
} }

View File

@@ -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);
Map parsedMap = JSON.decode(response.body);
if (parsedMap.containsKey('errors')) {
List<String> errors = parsedMap['errors'];
// TODO: ПОказывать сообщение с ошибкой!
} else {
helper.close().then((_) { helper.close().then((_) {
Navigator.of(context).pop(); Navigator.of(context).pop();
pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name'])); pushRouteReplacement(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name']));
}); });
}
}).catchError((error) { }).catchError((error) {
purchaseInProgress = false; purchaseInProgress = false;

View File

@@ -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();
} }

View File

@@ -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;
@@ -36,13 +33,13 @@ class SettingsState extends BaseState<SettingsScreen> {
@override Widget build(BuildContext ctx) { @override Widget build(BuildContext ctx) {
helper.getSettings().then((info) { helper.getSettings().then((info) {
if (menuItems != null) {
if (menuItems[0].selectedValue != info['currency'].toString()) {
setState(() { setState(() {
print("load settings"); menuItems[0].selectedValue = info['currency'].toString();
menuItems = [
// new MenuItem(StringsLocalization.locale(), getLocaleTitle(info["locale"])),
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));
} }
} }

View File

@@ -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) {
Intl.defaultLocale = locale;
StringsLocalization.load(locale).then((l) {
platform.invokeMethod('getCurrency').then((currency) { platform.invokeMethod('getCurrency').then((currency) {
platform.invokeMethod('getLocale').then((locale) {
initLocale(locale, () {
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());